source: SHVCSoftware/branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncTop.cpp @ 503

Last change on this file since 503 was 122, checked in by seregin, 12 years ago

making VPS static

File size: 37.2 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     TEncTop.cpp
35    \brief    encoder class
36*/
37
38#include "TLibCommon/CommonDef.h"
39#include "TEncTop.h"
40#include "TEncPic.h"
41#if FAST_BIT_EST
42#include "TLibCommon/ContextModel.h"
43#endif
44
45//! \ingroup TLibEncoder
46//! \{
47#if SVC_EXTENSION 
48Int TEncTop::m_iSPSIdCnt = 0;
49Int TEncTop::m_iPPSIdCnt = 0;
50TComVPS TEncCfg::m_cVPS;
51#endif
52
53// ====================================================================================================================
54// Constructor / destructor / create / destroy
55// ====================================================================================================================
56
57TEncTop::TEncTop()
58{
59  m_iPOCLast          = -1;
60  m_iNumPicRcvd       =  0;
61  m_uiNumAllPicCoded  =  0;
62  m_pppcRDSbacCoder   =  NULL;
63  m_pppcBinCoderCABAC =  NULL;
64  m_cRDGoOnSbacCoder.init( &m_cRDGoOnBinCoderCABAC );
65#if ENC_DEC_TRACE
66  g_hTrace = fopen( "TraceEnc.txt", "wb" );
67  g_bJustDoIt = g_bEncDecTraceDisable;
68  g_nSymbolCounter = 0;
69#endif
70
71  m_iMaxRefPicNum     = 0;
72
73#if FAST_BIT_EST
74  ContextModel::buildNextStateTable();
75#endif
76
77  m_pcSbacCoders           = NULL;
78  m_pcBinCoderCABACs       = NULL;
79  m_ppppcRDSbacCoders      = NULL;
80  m_ppppcBinCodersCABAC    = NULL;
81  m_pcRDGoOnSbacCoders     = NULL;
82  m_pcRDGoOnBinCodersCABAC = NULL;
83  m_pcBitCounters          = NULL;
84  m_pcRdCosts              = NULL;
85#if REF_IDX_FRAMEWORK
86  memset(m_cIlpPic, 0, sizeof(m_cIlpPic));
87#endif
88#if REF_IDX_MFM
89  m_bMFMEnabledFlag = false;
90#endif
91}
92
93TEncTop::~TEncTop()
94{
95#if ENC_DEC_TRACE
96  fclose( g_hTrace );
97#endif
98}
99
100Void TEncTop::create ()
101{
102#if !SVC_EXTENSION
103  // initialize global variables
104  initROM();
105#endif
106 
107  // create processing unit classes
108#if SVC_EXTENSION
109  m_cGOPEncoder.        create( m_layerId );
110#else
111  m_cGOPEncoder.        create();
112#endif
113  m_cSliceEncoder.      create( getSourceWidth(), getSourceHeight(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth );
114  m_cCuEncoder.         create( g_uiMaxCUDepth, g_uiMaxCUWidth, g_uiMaxCUHeight );
115  if (m_bUseSAO)
116  {
117    m_cEncSAO.setSaoLcuBoundary(getSaoLcuBoundary());
118    m_cEncSAO.setSaoLcuBasedOptimization(getSaoLcuBasedOptimization());
119    m_cEncSAO.setMaxNumOffsetsPerPic(getMaxNumOffsetsPerPic());
120    m_cEncSAO.create( getSourceWidth(), getSourceHeight(), g_uiMaxCUWidth, g_uiMaxCUHeight );
121    m_cEncSAO.createEncBuffer();
122  }
123#if ADAPTIVE_QP_SELECTION
124  if (m_bUseAdaptQpSelect)
125  {
126    m_cTrQuant.initSliceQpDelta();
127  }
128#endif
129  m_cLoopFilter.        create( g_uiMaxCUDepth );
130 
131#if RATE_CONTROL_LAMBDA_DOMAIN
132  if ( m_RCEnableRateControl )
133  {
134    m_cRateCtrl.init( m_framesToBeEncoded, m_RCTargetBitrate, m_iFrameRate, m_iGOPSize, m_iSourceWidth, m_iSourceHeight,
135                      g_uiMaxCUWidth, g_uiMaxCUHeight, m_RCKeepHierarchicalBit, m_RCUseLCUSeparateModel, m_GOPList );
136  }
137#else
138  m_cRateCtrl.create(getIntraPeriod(), getGOPSize(), getFrameRate(), getTargetBitrate(), getQP(), getNumLCUInUnit(), getSourceWidth(), getSourceHeight(), g_uiMaxCUWidth, g_uiMaxCUHeight);
139#endif
140  // if SBAC-based RD optimization is used
141  if( m_bUseSBACRD )
142  {
143    m_pppcRDSbacCoder = new TEncSbac** [g_uiMaxCUDepth+1];
144#if FAST_BIT_EST
145    m_pppcBinCoderCABAC = new TEncBinCABACCounter** [g_uiMaxCUDepth+1];
146#else
147    m_pppcBinCoderCABAC = new TEncBinCABAC** [g_uiMaxCUDepth+1];
148#endif
149   
150    for ( Int iDepth = 0; iDepth < g_uiMaxCUDepth+1; iDepth++ )
151    {
152      m_pppcRDSbacCoder[iDepth] = new TEncSbac* [CI_NUM];
153#if FAST_BIT_EST
154      m_pppcBinCoderCABAC[iDepth] = new TEncBinCABACCounter* [CI_NUM];
155#else
156      m_pppcBinCoderCABAC[iDepth] = new TEncBinCABAC* [CI_NUM];
157#endif
158     
159      for (Int iCIIdx = 0; iCIIdx < CI_NUM; iCIIdx ++ )
160      {
161        m_pppcRDSbacCoder[iDepth][iCIIdx] = new TEncSbac;
162#if FAST_BIT_EST
163        m_pppcBinCoderCABAC [iDepth][iCIIdx] = new TEncBinCABACCounter;
164#else
165        m_pppcBinCoderCABAC [iDepth][iCIIdx] = new TEncBinCABAC;
166#endif
167        m_pppcRDSbacCoder   [iDepth][iCIIdx]->init( m_pppcBinCoderCABAC [iDepth][iCIIdx] );
168      }
169    }
170  }
171}
172
173/**
174 - Allocate coders required for wavefront for the nominated number of substreams.
175 .
176 \param iNumSubstreams Determines how much information to allocate.
177 */
178Void TEncTop::createWPPCoders(Int iNumSubstreams)
179{
180  if (m_pcSbacCoders != NULL)
181  {
182    return; // already generated.
183  }
184
185  m_iNumSubstreams         = iNumSubstreams;
186  m_pcSbacCoders           = new TEncSbac       [iNumSubstreams];
187  m_pcBinCoderCABACs       = new TEncBinCABAC   [iNumSubstreams];
188  m_pcRDGoOnSbacCoders     = new TEncSbac       [iNumSubstreams];
189  m_pcRDGoOnBinCodersCABAC = new TEncBinCABAC   [iNumSubstreams];
190  m_pcBitCounters          = new TComBitCounter [iNumSubstreams];
191  m_pcRdCosts              = new TComRdCost     [iNumSubstreams];
192
193  for ( UInt ui = 0 ; ui < iNumSubstreams; ui++ )
194  {
195    m_pcRDGoOnSbacCoders[ui].init( &m_pcRDGoOnBinCodersCABAC[ui] );
196    m_pcSbacCoders[ui].init( &m_pcBinCoderCABACs[ui] );
197  }
198  if( m_bUseSBACRD )
199  {
200    m_ppppcRDSbacCoders      = new TEncSbac***    [iNumSubstreams];
201    m_ppppcBinCodersCABAC    = new TEncBinCABAC***[iNumSubstreams];
202    for ( UInt ui = 0 ; ui < iNumSubstreams ; ui++ )
203    {
204      m_ppppcRDSbacCoders[ui]  = new TEncSbac** [g_uiMaxCUDepth+1];
205      m_ppppcBinCodersCABAC[ui]= new TEncBinCABAC** [g_uiMaxCUDepth+1];
206     
207      for ( Int iDepth = 0; iDepth < g_uiMaxCUDepth+1; iDepth++ )
208      {
209        m_ppppcRDSbacCoders[ui][iDepth]  = new TEncSbac*     [CI_NUM];
210        m_ppppcBinCodersCABAC[ui][iDepth]= new TEncBinCABAC* [CI_NUM];
211
212        for (Int iCIIdx = 0; iCIIdx < CI_NUM; iCIIdx ++ )
213        {
214          m_ppppcRDSbacCoders  [ui][iDepth][iCIIdx] = new TEncSbac;
215          m_ppppcBinCodersCABAC[ui][iDepth][iCIIdx] = new TEncBinCABAC;
216          m_ppppcRDSbacCoders  [ui][iDepth][iCIIdx]->init( m_ppppcBinCodersCABAC[ui][iDepth][iCIIdx] );
217        }
218      }
219    }
220  }
221}
222
223Void TEncTop::destroy ()
224{
225  // destroy processing unit classes
226  m_cGOPEncoder.        destroy();
227  m_cSliceEncoder.      destroy();
228  m_cCuEncoder.         destroy();
229  if (m_cSPS.getUseSAO())
230  {
231    m_cEncSAO.destroy();
232    m_cEncSAO.destroyEncBuffer();
233  }
234  m_cLoopFilter.        destroy();
235  m_cRateCtrl.          destroy();
236  // SBAC RD
237  if( m_bUseSBACRD )
238  {
239    Int iDepth;
240    for ( iDepth = 0; iDepth < g_uiMaxCUDepth+1; iDepth++ )
241    {
242      for (Int iCIIdx = 0; iCIIdx < CI_NUM; iCIIdx ++ )
243      {
244        delete m_pppcRDSbacCoder[iDepth][iCIIdx];
245        delete m_pppcBinCoderCABAC[iDepth][iCIIdx];
246      }
247    }
248   
249    for ( iDepth = 0; iDepth < g_uiMaxCUDepth+1; iDepth++ )
250    {
251      delete [] m_pppcRDSbacCoder[iDepth];
252      delete [] m_pppcBinCoderCABAC[iDepth];
253    }
254   
255    delete [] m_pppcRDSbacCoder;
256    delete [] m_pppcBinCoderCABAC;
257
258    for ( UInt ui = 0; ui < m_iNumSubstreams; ui++ )
259    {
260      for ( iDepth = 0; iDepth < g_uiMaxCUDepth+1; iDepth++ )
261      {
262        for (Int iCIIdx = 0; iCIIdx < CI_NUM; iCIIdx ++ )
263        {
264          delete m_ppppcRDSbacCoders  [ui][iDepth][iCIIdx];
265          delete m_ppppcBinCodersCABAC[ui][iDepth][iCIIdx];
266        }
267      }
268
269      for ( iDepth = 0; iDepth < g_uiMaxCUDepth+1; iDepth++ )
270      {
271        delete [] m_ppppcRDSbacCoders  [ui][iDepth];
272        delete [] m_ppppcBinCodersCABAC[ui][iDepth];
273      }
274      delete[] m_ppppcRDSbacCoders  [ui];
275      delete[] m_ppppcBinCodersCABAC[ui];
276    }
277    delete[] m_ppppcRDSbacCoders;
278    delete[] m_ppppcBinCodersCABAC;
279  }
280  delete[] m_pcSbacCoders;
281  delete[] m_pcBinCoderCABACs;
282  delete[] m_pcRDGoOnSbacCoders; 
283  delete[] m_pcRDGoOnBinCodersCABAC;
284  delete[] m_pcBitCounters;
285  delete[] m_pcRdCosts;
286 
287#if !SVC_EXTENSION
288  // destroy ROM
289  destroyROM();
290#endif
291#if REF_IDX_FRAMEWORK
292  for(Int i=0; i<MAX_NUM_REF; i++)
293  {
294    if(m_cIlpPic[i])
295    {
296      //m_cIlpPic[i]->setPicYuvRec(NULL);
297      m_cIlpPic[i]->destroy();
298      delete m_cIlpPic[i];
299      m_cIlpPic[i] = NULL;
300    }
301  }   
302#endif
303  return;
304}
305
306Void TEncTop::init()
307{
308  // initialize SPS
309  xInitSPS();
310 
311  /* set the VPS profile information */
312  *m_cVPS.getPTL() = *m_cSPS.getPTL();
313#if L0043_TIMING_INFO
314  m_cVPS.getTimingInfo()->setTimingInfoPresentFlag       ( false );
315#endif
316  // initialize PPS
317  m_cPPS.setSPS(&m_cSPS);
318  xInitPPS();
319  xInitRPS();
320
321  xInitPPSforTiles();
322
323  // initialize processing unit classes
324  m_cGOPEncoder.  init( this );
325  m_cSliceEncoder.init( this );
326  m_cCuEncoder.   init( this );
327 
328  // initialize transform & quantization class
329  m_pcCavlcCoder = getCavlcCoder();
330 
331  m_cTrQuant.init( 1 << m_uiQuadtreeTULog2MaxSize,
332                  m_useRDOQ, 
333                  m_useRDOQTS,
334                  true 
335                  ,m_useTransformSkipFast
336#if ADAPTIVE_QP_SELECTION                 
337                  , m_bUseAdaptQpSelect
338#endif
339                  );
340 
341  // initialize encoder search class
342  m_cSearch.init( this, &m_cTrQuant, m_iSearchRange, m_bipredSearchRange, m_iFastSearch, 0, &m_cEntropyCoder, &m_cRdCost, getRDSbacCoder(), getRDGoOnSbacCoder() );
343
344  m_iMaxRefPicNum = 0;
345#if SVC_EXTENSION
346  m_iSPSIdCnt ++;
347  m_iPPSIdCnt ++;
348#endif
349#if REF_IDX_FRAMEWORK
350  xInitILRP();
351#endif
352}
353
354// ====================================================================================================================
355// Public member functions
356// ====================================================================================================================
357
358Void TEncTop::deletePicBuffer()
359{
360  TComList<TComPic*>::iterator iterPic = m_cListPic.begin();
361  Int iSize = Int( m_cListPic.size() );
362 
363  for ( Int i = 0; i < iSize; i++ )
364  {
365    TComPic* pcPic = *(iterPic++);
366   
367    pcPic->destroy();
368    delete pcPic;
369    pcPic = NULL;
370  }
371}
372
373/**
374 - Application has picture buffer list with size of GOP + 1
375 - Picture buffer list acts like as ring buffer
376 - End of the list has the latest picture
377 .
378 \param   flush               cause encoder to encode a partial GOP
379 \param   pcPicYuvOrg         original YUV picture
380 \retval  rcListPicYuvRecOut  list of reconstruction YUV pictures
381 \retval  rcListBitstreamOut  list of output bitstreams
382 \retval  iNumEncoded         number of encoded pictures
383 */
384#if SVC_EXTENSION
385Void TEncTop::encode( TComPicYuv* pcPicYuvOrg, TComList<TComPicYuv*>& rcListPicYuvRecOut, std::list<AccessUnit>& accessUnitsOut, Int iPicIdInGOP )
386{
387  // compress GOP
388#if RATE_CONTROL_LAMBDA_DOMAIN
389  if ( m_RCEnableRateControl )
390  {
391    m_cRateCtrl.initRCGOP( m_iNumPicRcvd );
392  }
393#endif
394
395  // compress GOP
396  m_cGOPEncoder.compressGOP(iPicIdInGOP, m_iPOCLast, m_iNumPicRcvd, m_cListPic, rcListPicYuvRecOut, accessUnitsOut);
397
398#if RATE_CONTROL_LAMBDA_DOMAIN
399  if ( m_RCEnableRateControl )
400  {
401    m_cRateCtrl.destroyRCGOP();
402  }
403#endif
404 
405  m_uiNumAllPicCoded ++;
406}
407
408Void TEncTop::encodePrep( TComPicYuv* pcPicYuvOrg )
409{
410  if (pcPicYuvOrg) 
411  {
412    // get original YUV
413    TComPic* pcPicCurr = NULL;
414    xGetNewPicBuffer( pcPicCurr );
415    pcPicYuvOrg->copyToPic( pcPicCurr->getPicYuvOrg() );
416
417    // compute image characteristics
418    if ( getUseAdaptiveQP() )
419    {
420      m_cPreanalyzer.xPreanalyze( dynamic_cast<TEncPic*>( pcPicCurr ) );
421    }
422  }
423}
424#else
425Void TEncTop::encode(Bool flush, TComPicYuv* pcPicYuvOrg, TComList<TComPicYuv*>& rcListPicYuvRecOut, std::list<AccessUnit>& accessUnitsOut, Int& iNumEncoded )
426{
427  if (pcPicYuvOrg) {
428    // get original YUV
429    TComPic* pcPicCurr = NULL;
430    xGetNewPicBuffer( pcPicCurr );
431    pcPicYuvOrg->copyToPic( pcPicCurr->getPicYuvOrg() );
432
433    // compute image characteristics
434    if ( getUseAdaptiveQP() )
435    {
436      m_cPreanalyzer.xPreanalyze( dynamic_cast<TEncPic*>( pcPicCurr ) );
437    }
438  }
439 
440  if (!m_iNumPicRcvd || (!flush && m_iPOCLast != 0 && m_iNumPicRcvd != m_iGOPSize && m_iGOPSize))
441  {
442    iNumEncoded = 0;
443    return;
444  }
445 
446#if RATE_CONTROL_LAMBDA_DOMAIN
447  if ( m_RCEnableRateControl )
448  {
449    m_cRateCtrl.initRCGOP( m_iNumPicRcvd );
450  }
451#endif
452
453  // compress GOP
454  m_cGOPEncoder.compressGOP(m_iPOCLast, m_iNumPicRcvd, m_cListPic, rcListPicYuvRecOut, accessUnitsOut);
455
456#if RATE_CONTROL_LAMBDA_DOMAIN
457  if ( m_RCEnableRateControl )
458  {
459    m_cRateCtrl.destroyRCGOP();
460  }
461#endif
462 
463  iNumEncoded         = m_iNumPicRcvd;
464  m_iNumPicRcvd       = 0;
465  m_uiNumAllPicCoded += iNumEncoded;
466}
467#endif
468
469// ====================================================================================================================
470// Protected member functions
471// ====================================================================================================================
472
473/**
474 - Application has picture buffer list with size of GOP + 1
475 - Picture buffer list acts like as ring buffer
476 - End of the list has the latest picture
477 .
478 \retval rpcPic obtained picture buffer
479 */
480Void TEncTop::xGetNewPicBuffer ( TComPic*& rpcPic )
481{
482  TComSlice::sortPicList(m_cListPic);
483 
484  if (m_cListPic.size() >= (UInt)(m_iGOPSize + getMaxDecPicBuffering(MAX_TLAYER-1) + 2) )
485  {
486    TComList<TComPic*>::iterator iterPic  = m_cListPic.begin();
487    Int iSize = Int( m_cListPic.size() );
488    for ( Int i = 0; i < iSize; i++ )
489    {
490      rpcPic = *(iterPic++);
491      if(rpcPic->getSlice(0)->isReferenced() == false)
492      {
493        break;
494      }
495    }
496  }
497  else
498  {
499    if ( getUseAdaptiveQP() )
500    {
501      TEncPic* pcEPic = new TEncPic;
502#if SVC_EXTENSION //Temporal solution, should be modified
503      if(m_layerId > 0)
504      {
505        TEncTop *pcEncTopBase = (TEncTop *)getLayerEnc( m_layerId-1 );
506        if(m_iSourceWidth != pcEncTopBase->getSourceWidth() || m_iSourceHeight != pcEncTopBase->getSourceHeight() )
507        {
508          pcEPic->setSpatialEnhLayerFlag( true );
509        }
510      }
511#endif
512
513#if SVC_UPSAMPLING
514      pcEPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, m_cPPS.getMaxCuDQPDepth()+1 ,
515                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics, &m_cSPS);
516#else
517      pcEPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, m_cPPS.getMaxCuDQPDepth()+1 ,
518                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics);
519#endif
520      rpcPic = pcEPic;
521    }
522    else
523    {
524      rpcPic = new TComPic;
525
526#if SVC_EXTENSION //Temporal solution, should be modified
527      if(m_layerId > 0)
528      {
529        TEncTop *pcEncTopBase = (TEncTop *)getLayerEnc( m_layerId-1 );
530        if(m_iSourceWidth != pcEncTopBase->getSourceWidth() || m_iSourceHeight != pcEncTopBase->getSourceHeight() )
531        {
532          rpcPic->setSpatialEnhLayerFlag( true );
533        }
534      }
535#endif
536
537#if SVC_UPSAMPLING
538      rpcPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, 
539                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics, &m_cSPS);
540#else
541      rpcPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, 
542                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics);
543#endif
544    }
545    if (getUseSAO())
546    {
547      rpcPic->getPicSym()->allocSaoParam(&m_cEncSAO);
548    }
549    m_cListPic.pushBack( rpcPic );
550  }
551  rpcPic->setReconMark (false);
552 
553  m_iPOCLast++;
554  m_iNumPicRcvd++;
555 
556  rpcPic->getSlice(0)->setPOC( m_iPOCLast );
557  // mark it should be extended
558  rpcPic->getPicYuvRec()->setBorderExtension(false);
559}
560
561Void TEncTop::xInitSPS()
562{
563#if SVC_EXTENSION
564  m_cSPS.setLayerId(m_layerId);
565#endif
566#if REF_IDX_MFM
567  m_cSPS.setMFMEnabledFlag(m_bMFMEnabledFlag);
568#endif
569  ProfileTierLevel& profileTierLevel = *m_cSPS.getPTL()->getGeneralPTL();
570  profileTierLevel.setLevelIdc(m_level);
571  profileTierLevel.setTierFlag(m_levelTier);
572  profileTierLevel.setProfileIdc(m_profile);
573  profileTierLevel.setProfileCompatibilityFlag(m_profile, 1);
574#if L0046_CONSTRAINT_FLAGS
575  profileTierLevel.setProgressiveSourceFlag(m_progressiveSourceFlag);
576  profileTierLevel.setInterlacedSourceFlag(m_interlacedSourceFlag);
577  profileTierLevel.setNonPackedConstraintFlag(m_nonPackedConstraintFlag);
578  profileTierLevel.setFrameOnlyConstraintFlag(m_frameOnlyConstraintFlag);
579#endif
580 
581  if (m_profile == Profile::MAIN10 && g_bitDepthY == 8 && g_bitDepthC == 8)
582  {
583    /* The above constraint is equal to Profile::MAIN */
584    profileTierLevel.setProfileCompatibilityFlag(Profile::MAIN, 1);
585  }
586  if (m_profile == Profile::MAIN)
587  {
588    /* A Profile::MAIN10 decoder can always decode Profile::MAIN */
589    profileTierLevel.setProfileCompatibilityFlag(Profile::MAIN10, 1);
590  }
591  /* XXX: should Main be marked as compatible with still picture? */
592  /* XXX: may be a good idea to refactor the above into a function
593   * that chooses the actual compatibility based upon options */
594
595  m_cSPS.setPicWidthInLumaSamples         ( m_iSourceWidth      );
596  m_cSPS.setPicHeightInLumaSamples        ( m_iSourceHeight     );
597  m_cSPS.setConformanceWindow             ( m_conformanceWindow );
598  m_cSPS.setMaxCUWidth    ( g_uiMaxCUWidth      );
599  m_cSPS.setMaxCUHeight   ( g_uiMaxCUHeight     );
600  m_cSPS.setMaxCUDepth    ( g_uiMaxCUDepth      );
601  m_cSPS.setMinTrDepth    ( 0                   );
602  m_cSPS.setMaxTrDepth    ( 1                   );
603#if SVC_EXTENSION
604  m_cSPS.setSPSId         ( m_iSPSIdCnt       );
605#endif
606 
607  m_cSPS.setPCMLog2MinSize (m_uiPCMLog2MinSize);
608  m_cSPS.setUsePCM        ( m_usePCM           );
609  m_cSPS.setPCMLog2MaxSize( m_pcmLog2MaxSize  );
610
611  m_cSPS.setQuadtreeTULog2MaxSize( m_uiQuadtreeTULog2MaxSize );
612  m_cSPS.setQuadtreeTULog2MinSize( m_uiQuadtreeTULog2MinSize );
613  m_cSPS.setQuadtreeTUMaxDepthInter( m_uiQuadtreeTUMaxDepthInter    );
614  m_cSPS.setQuadtreeTUMaxDepthIntra( m_uiQuadtreeTUMaxDepthIntra    );
615 
616  m_cSPS.setTMVPFlagsPresent(false);
617  m_cSPS.setUseLossless   ( m_useLossless  );
618
619  m_cSPS.setMaxTrSize   ( 1 << m_uiQuadtreeTULog2MaxSize );
620 
621  m_cSPS.setUseLComb    ( m_bUseLComb           );
622 
623  Int i;
624 
625  for (i = 0; i < g_uiMaxCUDepth-g_uiAddCUDepth; i++ )
626  {
627    m_cSPS.setAMPAcc( i, m_useAMP );
628    //m_cSPS.setAMPAcc( i, 1 );
629  }
630
631  m_cSPS.setUseAMP ( m_useAMP );
632
633  for (i = g_uiMaxCUDepth-g_uiAddCUDepth; i < g_uiMaxCUDepth; i++ )
634  {
635    m_cSPS.setAMPAcc(i, 0);
636  }
637
638  m_cSPS.setBitDepthY( g_bitDepthY );
639  m_cSPS.setBitDepthC( g_bitDepthC );
640
641  m_cSPS.setQpBDOffsetY ( 6*(g_bitDepthY - 8) );
642  m_cSPS.setQpBDOffsetC ( 6*(g_bitDepthC - 8) );
643
644  m_cSPS.setUseSAO( m_bUseSAO );
645
646  m_cSPS.setMaxTLayers( m_maxTempLayer );
647  m_cSPS.setTemporalIdNestingFlag( ( m_maxTempLayer == 1 ) ? true : false );
648  for ( i = 0; i < m_cSPS.getMaxTLayers(); i++ )
649  {
650    m_cSPS.setMaxDecPicBuffering(m_maxDecPicBuffering[i], i);
651    m_cSPS.setNumReorderPics(m_numReorderPics[i], i);
652  }
653  m_cSPS.setPCMBitDepthLuma (g_uiPCMBitDepthLuma);
654  m_cSPS.setPCMBitDepthChroma (g_uiPCMBitDepthChroma);
655  m_cSPS.setPCMFilterDisableFlag  ( m_bPCMFilterDisableFlag );
656
657  m_cSPS.setScalingListFlag ( (m_useScalingListId == 0) ? 0 : 1 );
658
659  m_cSPS.setUseStrongIntraSmoothing( m_useStrongIntraSmoothing );
660
661  m_cSPS.setVuiParametersPresentFlag(getVuiParametersPresentFlag());
662  if (m_cSPS.getVuiParametersPresentFlag())
663  {
664    TComVUI* pcVUI = m_cSPS.getVuiParameters();
665    pcVUI->setAspectRatioInfoPresentFlag(getAspectRatioIdc() != -1);
666    pcVUI->setAspectRatioIdc(getAspectRatioIdc());
667    pcVUI->setSarWidth(getSarWidth());
668    pcVUI->setSarHeight(getSarHeight());
669    pcVUI->setOverscanInfoPresentFlag(getOverscanInfoPresentFlag());
670    pcVUI->setOverscanAppropriateFlag(getOverscanAppropriateFlag());
671    pcVUI->setVideoSignalTypePresentFlag(getVideoSignalTypePresentFlag());
672    pcVUI->setVideoFormat(getVideoFormat());
673    pcVUI->setVideoFullRangeFlag(getVideoFullRangeFlag());
674    pcVUI->setColourDescriptionPresentFlag(getColourDescriptionPresentFlag());
675    pcVUI->setColourPrimaries(getColourPrimaries());
676    pcVUI->setTransferCharacteristics(getTransferCharacteristics());
677    pcVUI->setMatrixCoefficients(getMatrixCoefficients());
678    pcVUI->setChromaLocInfoPresentFlag(getChromaLocInfoPresentFlag());
679    pcVUI->setChromaSampleLocTypeTopField(getChromaSampleLocTypeTopField());
680    pcVUI->setChromaSampleLocTypeBottomField(getChromaSampleLocTypeBottomField());
681    pcVUI->setNeutralChromaIndicationFlag(getNeutralChromaIndicationFlag());
682    pcVUI->setDefaultDisplayWindow(getDefaultDisplayWindow());
683    pcVUI->setFrameFieldInfoPresentFlag(getFrameFieldInfoPresentFlag());
684    pcVUI->setFieldSeqFlag(false);
685    pcVUI->setHrdParametersPresentFlag(false);
686#if L0043_TIMING_INFO
687    pcVUI->getTimingInfo()->setPocProportionalToTimingFlag(getPocProportionalToTimingFlag());
688    pcVUI->getTimingInfo()->setNumTicksPocDiffOneMinus1   (getNumTicksPocDiffOneMinus1()   );
689#else
690    pcVUI->setPocProportionalToTimingFlag(getPocProportionalToTimingFlag());
691    pcVUI->setNumTicksPocDiffOneMinus1   (getNumTicksPocDiffOneMinus1()   );
692#endif
693    pcVUI->setBitstreamRestrictionFlag(getBitstreamRestrictionFlag());
694    pcVUI->setTilesFixedStructureFlag(getTilesFixedStructureFlag());
695    pcVUI->setMotionVectorsOverPicBoundariesFlag(getMotionVectorsOverPicBoundariesFlag());
696    pcVUI->setMinSpatialSegmentationIdc(getMinSpatialSegmentationIdc());
697    pcVUI->setMaxBytesPerPicDenom(getMaxBytesPerPicDenom());
698    pcVUI->setMaxBitsPerMinCuDenom(getMaxBitsPerMinCuDenom());
699    pcVUI->setLog2MaxMvLengthHorizontal(getLog2MaxMvLengthHorizontal());
700    pcVUI->setLog2MaxMvLengthVertical(getLog2MaxMvLengthVertical());
701  }
702}
703
704Void TEncTop::xInitPPS()
705{
706  m_cPPS.setConstrainedIntraPred( m_bUseConstrainedIntraPred );
707  Bool bUseDQP = (getMaxCuDQPDepth() > 0)? true : false;
708
709  Int lowestQP = - m_cSPS.getQpBDOffsetY();
710
711  if(getUseLossless())
712  {
713    if ((getMaxCuDQPDepth() == 0) && (getMaxDeltaQP() == 0 ) && (getQP() == lowestQP) )
714    {
715      bUseDQP = false;
716    }
717    else
718    {
719      bUseDQP = true;
720    }
721  }
722  else
723  {
724    if(bUseDQP == false)
725    {
726      if((getMaxDeltaQP() != 0 )|| getUseAdaptiveQP())
727      {
728        bUseDQP = true;
729      }
730    }
731  }
732
733  if(bUseDQP)
734  {
735    m_cPPS.setUseDQP(true);
736    m_cPPS.setMaxCuDQPDepth( m_iMaxCuDQPDepth );
737    m_cPPS.setMinCuDQPSize( m_cPPS.getSPS()->getMaxCUWidth() >> ( m_cPPS.getMaxCuDQPDepth()) );
738  }
739  else
740  {
741    m_cPPS.setUseDQP(false);
742    m_cPPS.setMaxCuDQPDepth( 0 );
743    m_cPPS.setMinCuDQPSize( m_cPPS.getSPS()->getMaxCUWidth() >> ( m_cPPS.getMaxCuDQPDepth()) );
744  }
745
746#if RATE_CONTROL_LAMBDA_DOMAIN
747  if ( m_RCEnableRateControl )
748  {
749    m_cPPS.setUseDQP(true);
750    m_cPPS.setMaxCuDQPDepth( 0 );
751    m_cPPS.setMinCuDQPSize( m_cPPS.getSPS()->getMaxCUWidth() >> ( m_cPPS.getMaxCuDQPDepth()) );
752  } 
753#endif
754
755  m_cPPS.setChromaCbQpOffset( m_chromaCbQpOffset );
756  m_cPPS.setChromaCrQpOffset( m_chromaCrQpOffset );
757
758  m_cPPS.setNumSubstreams(m_iWaveFrontSubstreams);
759  m_cPPS.setEntropyCodingSyncEnabledFlag( m_iWaveFrontSynchro > 0 );
760  m_cPPS.setTilesEnabledFlag( (m_iNumColumnsMinus1 > 0 || m_iNumRowsMinus1 > 0) );
761  m_cPPS.setUseWP( m_useWeightedPred );
762  m_cPPS.setWPBiPred( m_useWeightedBiPred );
763  m_cPPS.setOutputFlagPresentFlag( false );
764  m_cPPS.setSignHideFlag(getSignHideFlag());
765  m_cPPS.setDeblockingFilterControlPresentFlag (m_DeblockingFilterControlPresent );
766  m_cPPS.setLog2ParallelMergeLevelMinus2   (m_log2ParallelMergeLevelMinus2 );
767  m_cPPS.setCabacInitPresentFlag(CABAC_INIT_PRESENT_FLAG);
768  m_cPPS.setLoopFilterAcrossSlicesEnabledFlag( m_bLFCrossSliceBoundaryFlag );
769  Int histogram[MAX_NUM_REF + 1];
770  for( Int i = 0; i <= MAX_NUM_REF; i++ )
771  {
772    histogram[i]=0;
773  }
774  for( Int i = 0; i < getGOPSize(); i++ )
775  {
776    assert(getGOPEntry(i).m_numRefPicsActive >= 0 && getGOPEntry(i).m_numRefPicsActive <= MAX_NUM_REF);
777    histogram[getGOPEntry(i).m_numRefPicsActive]++;
778  }
779  Int maxHist=-1;
780  Int bestPos=0;
781  for( Int i = 0; i <= MAX_NUM_REF; i++ )
782  {
783    if(histogram[i]>maxHist)
784    {
785      maxHist=histogram[i];
786      bestPos=i;
787    }
788  }
789#if L0323_LIMIT_DEFAULT_LIST_SIZE
790  assert(bestPos <= 15);
791#endif
792  m_cPPS.setNumRefIdxL0DefaultActive(bestPos);
793  m_cPPS.setNumRefIdxL1DefaultActive(bestPos);
794  m_cPPS.setTransquantBypassEnableFlag(getTransquantBypassEnableFlag());
795  m_cPPS.setUseTransformSkip( m_useTransformSkip );
796  if (m_sliceSegmentMode)
797  {
798    m_cPPS.setDependentSliceSegmentsEnabledFlag( true );
799  }
800  if( m_cPPS.getDependentSliceSegmentsEnabledFlag() )
801  {
802    Int NumCtx = m_cPPS.getEntropyCodingSyncEnabledFlag()?2:1;
803    m_cSliceEncoder.initCtxMem( NumCtx );
804    for ( UInt st = 0; st < NumCtx; st++ )
805    {
806      TEncSbac* ctx = NULL;
807      ctx = new TEncSbac;
808      ctx->init( &m_cBinCoderCABAC );
809      m_cSliceEncoder.setCtxMem( ctx, st );
810    }
811  }
812#if REF_LIST_BUGFIX
813  if (!m_layerId)
814  {
815    m_cPPS.setListsModificationPresentFlag(false);
816  }
817  else
818  {
819    m_cPPS.setListsModificationPresentFlag(true);
820  }
821#endif
822#if SVC_EXTENSION
823  m_cPPS.setPPSId         ( m_iPPSIdCnt         );
824  m_cPPS.setSPSId         ( m_iSPSIdCnt         );
825#endif
826}
827
828//Function for initializing m_RPSList, a list of TComReferencePictureSet, based on the GOPEntry objects read from the config file.
829Void TEncTop::xInitRPS()
830{
831  TComReferencePictureSet*      rps;
832 
833  m_cSPS.createRPSList(getGOPSize()+m_extraRPSs);
834  TComRPSList* rpsList = m_cSPS.getRPSList();
835
836  for( Int i = 0; i < getGOPSize()+m_extraRPSs; i++) 
837  {
838    GOPEntry ge = getGOPEntry(i);
839    rps = rpsList->getReferencePictureSet(i);
840    rps->setNumberOfPictures(ge.m_numRefPics);
841    rps->setNumRefIdc(ge.m_numRefIdc);
842    Int numNeg = 0;
843    Int numPos = 0;
844    for( Int j = 0; j < ge.m_numRefPics; j++)
845    {
846      rps->setDeltaPOC(j,ge.m_referencePics[j]);
847      rps->setUsed(j,ge.m_usedByCurrPic[j]);
848      if(ge.m_referencePics[j]>0)
849      {
850        numPos++;
851      }
852      else
853      {
854        numNeg++;
855      }
856    }
857    rps->setNumberOfNegativePictures(numNeg);
858    rps->setNumberOfPositivePictures(numPos);
859
860    // handle inter RPS intialization from the config file.
861#if AUTO_INTER_RPS
862    rps->setInterRPSPrediction(ge.m_interRPSPrediction > 0);  // not very clean, converting anything > 0 to true.
863    rps->setDeltaRIdxMinus1(0);                               // index to the Reference RPS is always the previous one.
864    TComReferencePictureSet*     RPSRef = rpsList->getReferencePictureSet(i-1);  // get the reference RPS
865
866    if (ge.m_interRPSPrediction == 2)  // Automatic generation of the inter RPS idc based on the RIdx provided.
867    {
868      Int deltaRPS = getGOPEntry(i-1).m_POC - ge.m_POC;  // the ref POC - current POC
869      Int numRefDeltaPOC = RPSRef->getNumberOfPictures();
870
871      rps->setDeltaRPS(deltaRPS);           // set delta RPS
872      rps->setNumRefIdc(numRefDeltaPOC+1);  // set the numRefIdc to the number of pictures in the reference RPS + 1.
873      Int count=0;
874      for (Int j = 0; j <= numRefDeltaPOC; j++ ) // cycle through pics in reference RPS.
875      {
876        Int RefDeltaPOC = (j<numRefDeltaPOC)? RPSRef->getDeltaPOC(j): 0;  // if it is the last decoded picture, set RefDeltaPOC = 0
877        rps->setRefIdc(j, 0);
878        for (Int k = 0; k < rps->getNumberOfPictures(); k++ )  // cycle through pics in current RPS.
879        {
880          if (rps->getDeltaPOC(k) == ( RefDeltaPOC + deltaRPS))  // if the current RPS has a same picture as the reference RPS.
881          {
882              rps->setRefIdc(j, (rps->getUsed(k)?1:2));
883              count++;
884              break;
885          }
886        }
887      }
888      if (count != rps->getNumberOfPictures())
889      {
890        printf("Warning: Unable fully predict all delta POCs using the reference RPS index given in the config file.  Setting Inter RPS to false for this RPS.\n");
891        rps->setInterRPSPrediction(0);
892      }
893    }
894    else if (ge.m_interRPSPrediction == 1)  // inter RPS idc based on the RefIdc values provided in config file.
895    {
896      rps->setDeltaRPS(ge.m_deltaRPS);
897      rps->setNumRefIdc(ge.m_numRefIdc);
898      for (Int j = 0; j < ge.m_numRefIdc; j++ )
899      {
900        rps->setRefIdc(j, ge.m_refIdc[j]);
901      }
902#if WRITE_BACK
903      // the folowing code overwrite the deltaPOC and Used by current values read from the config file with the ones
904      // computed from the RefIdc.  A warning is printed if they are not identical.
905      numNeg = 0;
906      numPos = 0;
907      TComReferencePictureSet      RPSTemp;  // temporary variable
908
909      for (Int j = 0; j < ge.m_numRefIdc; j++ )
910      {
911        if (ge.m_refIdc[j])
912        {
913          Int deltaPOC = ge.m_deltaRPS + ((j < RPSRef->getNumberOfPictures())? RPSRef->getDeltaPOC(j) : 0);
914          RPSTemp.setDeltaPOC((numNeg+numPos),deltaPOC);
915          RPSTemp.setUsed((numNeg+numPos),ge.m_refIdc[j]==1?1:0);
916          if (deltaPOC<0)
917          {
918            numNeg++;
919          }
920          else
921          {
922            numPos++;
923          }
924        }
925      }
926      if (numNeg != rps->getNumberOfNegativePictures())
927      {
928        printf("Warning: number of negative pictures in RPS is different between intra and inter RPS specified in the config file.\n");
929        rps->setNumberOfNegativePictures(numNeg);
930        rps->setNumberOfPositivePictures(numNeg+numPos);
931      }
932      if (numPos != rps->getNumberOfPositivePictures())
933      {
934        printf("Warning: number of positive pictures in RPS is different between intra and inter RPS specified in the config file.\n");
935        rps->setNumberOfPositivePictures(numPos);
936        rps->setNumberOfPositivePictures(numNeg+numPos);
937      }
938      RPSTemp.setNumberOfPictures(numNeg+numPos);
939      RPSTemp.setNumberOfNegativePictures(numNeg);
940      RPSTemp.sortDeltaPOC();     // sort the created delta POC before comparing
941      // check if Delta POC and Used are the same
942      // print warning if they are not.
943      for (Int j = 0; j < ge.m_numRefIdc; j++ )
944      {
945        if (RPSTemp.getDeltaPOC(j) != rps->getDeltaPOC(j))
946        {
947          printf("Warning: delta POC is different between intra RPS and inter RPS specified in the config file.\n");
948          rps->setDeltaPOC(j,RPSTemp.getDeltaPOC(j));
949        }
950        if (RPSTemp.getUsed(j) != rps->getUsed(j))
951        {
952          printf("Warning: Used by Current in RPS is different between intra and inter RPS specified in the config file.\n");
953          rps->setUsed(j,RPSTemp.getUsed(j));
954        }
955      }
956#endif
957    }
958#else
959    rps->setInterRPSPrediction(ge.m_interRPSPrediction);
960    if (ge.m_interRPSPrediction)
961    {
962      rps->setDeltaRIdxMinus1(0);
963      rps->setDeltaRPS(ge.m_deltaRPS);
964      rps->setNumRefIdc(ge.m_numRefIdc);
965      for (Int j = 0; j < ge.m_numRefIdc; j++ )
966      {
967        rps->setRefIdc(j, ge.m_refIdc[j]);
968      }
969#if WRITE_BACK
970      // the folowing code overwrite the deltaPOC and Used by current values read from the config file with the ones
971      // computed from the RefIdc.  This is not necessary if both are identical. Currently there is no check to see if they are identical.
972      numNeg = 0;
973      numPos = 0;
974      TComReferencePictureSet*     RPSRef = m_RPSList.getReferencePictureSet(i-1);
975
976      for (Int j = 0; j < ge.m_numRefIdc; j++ )
977      {
978        if (ge.m_refIdc[j])
979        {
980          Int deltaPOC = ge.m_deltaRPS + ((j < RPSRef->getNumberOfPictures())? RPSRef->getDeltaPOC(j) : 0);
981          rps->setDeltaPOC((numNeg+numPos),deltaPOC);
982          rps->setUsed((numNeg+numPos),ge.m_refIdc[j]==1?1:0);
983          if (deltaPOC<0)
984          {
985            numNeg++;
986          }
987          else
988          {
989            numPos++;
990          }
991        }
992      }
993      rps->setNumberOfNegativePictures(numNeg);
994      rps->setNumberOfPositivePictures(numPos);
995      rps->sortDeltaPOC();
996#endif
997    }
998#endif //INTER_RPS_AUTO
999  }
1000 
1001}
1002
1003   // This is a function that
1004   // determines what Reference Picture Set to use
1005   // for a specific slice (with POC = POCCurr)
1006Void TEncTop::selectReferencePictureSet(TComSlice* slice, Int POCCurr, Int GOPid )
1007{
1008  slice->setRPSidx(GOPid);
1009
1010  for(Int extraNum=m_iGOPSize; extraNum<m_extraRPSs+m_iGOPSize; extraNum++)
1011  {   
1012    if(m_uiIntraPeriod > 0 && getDecodingRefreshType() > 0)
1013    {
1014      Int POCIndex = POCCurr%m_uiIntraPeriod;
1015      if(POCIndex == 0)
1016      {
1017        POCIndex = m_uiIntraPeriod;
1018      }
1019      if(POCIndex == m_GOPList[extraNum].m_POC)
1020      {
1021        slice->setRPSidx(extraNum);
1022      }
1023    }
1024    else
1025    {
1026      if(POCCurr==m_GOPList[extraNum].m_POC)
1027      {
1028        slice->setRPSidx(extraNum);
1029      }
1030    }
1031  }
1032
1033  slice->setRPS(getSPS()->getRPSList()->getReferencePictureSet(slice->getRPSidx()));
1034  slice->getRPS()->setNumberOfPictures(slice->getRPS()->getNumberOfNegativePictures()+slice->getRPS()->getNumberOfPositivePictures());
1035
1036}
1037
1038Void  TEncTop::xInitPPSforTiles()
1039{
1040  m_cPPS.setUniformSpacingFlag( m_iUniformSpacingIdr );
1041  m_cPPS.setNumColumnsMinus1( m_iNumColumnsMinus1 );
1042  m_cPPS.setNumRowsMinus1( m_iNumRowsMinus1 );
1043  if( m_iUniformSpacingIdr == 0 )
1044  {
1045    m_cPPS.setColumnWidth( m_puiColumnWidth );
1046    m_cPPS.setRowHeight( m_puiRowHeight );
1047  }
1048  m_cPPS.setLoopFilterAcrossTilesEnabledFlag( m_loopFilterAcrossTilesEnabledFlag );
1049
1050  // # substreams is "per tile" when tiles are independent.
1051  if (m_iWaveFrontSynchro
1052    )
1053  {
1054    m_cPPS.setNumSubstreams(m_iWaveFrontSubstreams * (m_iNumColumnsMinus1+1));
1055  }
1056}
1057
1058Void  TEncCfg::xCheckGSParameters()
1059{
1060  Int   iWidthInCU = ( m_iSourceWidth%g_uiMaxCUWidth ) ? m_iSourceWidth/g_uiMaxCUWidth + 1 : m_iSourceWidth/g_uiMaxCUWidth;
1061  Int   iHeightInCU = ( m_iSourceHeight%g_uiMaxCUHeight ) ? m_iSourceHeight/g_uiMaxCUHeight + 1 : m_iSourceHeight/g_uiMaxCUHeight;
1062  UInt  uiCummulativeColumnWidth = 0;
1063  UInt  uiCummulativeRowHeight = 0;
1064
1065  //check the column relative parameters
1066  if( m_iNumColumnsMinus1 >= (1<<(LOG2_MAX_NUM_COLUMNS_MINUS1+1)) )
1067  {
1068    printf( "The number of columns is larger than the maximum allowed number of columns.\n" );
1069    exit( EXIT_FAILURE );
1070  }
1071
1072  if( m_iNumColumnsMinus1 >= iWidthInCU )
1073  {
1074    printf( "The current picture can not have so many columns.\n" );
1075    exit( EXIT_FAILURE );
1076  }
1077
1078  if( m_iNumColumnsMinus1 && m_iUniformSpacingIdr==0 )
1079  {
1080    for(Int i=0; i<m_iNumColumnsMinus1; i++)
1081    {
1082      uiCummulativeColumnWidth += m_puiColumnWidth[i];
1083    }
1084
1085    if( uiCummulativeColumnWidth >= iWidthInCU )
1086    {
1087      printf( "The width of the column is too large.\n" );
1088      exit( EXIT_FAILURE );
1089    }
1090  }
1091
1092  //check the row relative parameters
1093  if( m_iNumRowsMinus1 >= (1<<(LOG2_MAX_NUM_ROWS_MINUS1+1)) )
1094  {
1095    printf( "The number of rows is larger than the maximum allowed number of rows.\n" );
1096    exit( EXIT_FAILURE );
1097  }
1098
1099  if( m_iNumRowsMinus1 >= iHeightInCU )
1100  {
1101    printf( "The current picture can not have so many rows.\n" );
1102    exit( EXIT_FAILURE );
1103  }
1104
1105  if( m_iNumRowsMinus1 && m_iUniformSpacingIdr==0 )
1106  {
1107    for(Int i=0; i<m_iNumRowsMinus1; i++)
1108    {
1109      uiCummulativeRowHeight += m_puiRowHeight[i];
1110    }
1111
1112    if( uiCummulativeRowHeight >= iHeightInCU )
1113    {
1114      printf( "The height of the row is too large.\n" );
1115      exit( EXIT_FAILURE );
1116    }
1117  }
1118}
1119
1120#if REF_IDX_FRAMEWORK
1121Void TEncTop::xInitILRP()
1122{
1123  if(m_layerId>0)
1124  {
1125    Int  numReorderPics[MAX_TLAYER];
1126    Window &conformanceWindow = m_cSPS.getConformanceWindow();
1127    Window defaultDisplayWindow = m_cSPS.getVuiParametersPresentFlag() ? m_cSPS.getVuiParameters()->getDefaultDisplayWindow() : Window();
1128
1129    if (m_cIlpPic[0] == NULL)
1130    {
1131      for (Int j=0; j<1/*MAX_NUM_REF*/; j++)
1132      {
1133        m_cIlpPic[j] = new  TComPic;
1134        //m_cIlpPic[j]->createWithOutYuv(m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, &m_cSPS, true);
1135#if SVC_UPSAMPLING
1136        m_cIlpPic[j]->create(m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, conformanceWindow, defaultDisplayWindow, numReorderPics, &m_cSPS, true);
1137#else
1138        m_cIlpPic[j]->create(m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, conformanceWindow, defaultDisplayWindow, numReorderPics, true);
1139#endif
1140        for (Int i=0; i<m_cIlpPic[j]->getPicSym()->getNumberOfCUsInFrame(); i++)
1141        {
1142          m_cIlpPic[j]->getPicSym()->getCU(i)->initCU(m_cIlpPic[j], i);
1143        }
1144      }
1145    }
1146  }
1147}
1148
1149Void TEncTop::setILRPic(TComPic *pcPic)
1150{
1151  if(m_cIlpPic[0])
1152  {
1153    //m_cIlpPic[0]->setPicYuvRec(pcPic->getFullPelBaseRec());
1154    m_cIlpPic[0]->copyUpsampledPictureYuv(pcPic->getFullPelBaseRec(), m_cIlpPic[0]->getPicYuvRec());
1155    m_cIlpPic[0]->getSlice(0)->setPOC(pcPic->getPOC());
1156    m_cIlpPic[0]->setLayerId(0); //set reference layerId
1157    m_cIlpPic[0]->getPicYuvRec()->setBorderExtension(false);
1158    m_cIlpPic[0]->getPicYuvRec()->extendPicBorder();
1159  }
1160}
1161#endif
1162//! \}
Note: See TracBrowser for help on using the repository browser.