source: SHVCSoftware/branches/SHM-2.0-dev/source/Lib/TLibEncoder/TEncTop.cpp @ 577

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

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

File size: 39.5 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]->destroy();
297      delete m_cIlpPic[i];
298      m_cIlpPic[i] = NULL;
299    }
300  }   
301#endif
302  return;
303}
304
305Void TEncTop::init()
306{
307  // initialize SPS
308  xInitSPS();
309 
310  /* set the VPS profile information */
311  *m_cVPS.getPTL() = *m_cSPS.getPTL();
312#if L0043_TIMING_INFO
313  m_cVPS.getTimingInfo()->setTimingInfoPresentFlag       ( false );
314#endif
315  // initialize PPS
316  m_cPPS.setSPS(&m_cSPS);
317  xInitPPS();
318  xInitRPS();
319
320  xInitPPSforTiles();
321
322  // initialize processing unit classes
323  m_cGOPEncoder.  init( this );
324  m_cSliceEncoder.init( this );
325  m_cCuEncoder.   init( this );
326 
327  // initialize transform & quantization class
328  m_pcCavlcCoder = getCavlcCoder();
329 
330  m_cTrQuant.init( 1 << m_uiQuadtreeTULog2MaxSize,
331                  m_useRDOQ, 
332                  m_useRDOQTS,
333                  true 
334                  ,m_useTransformSkipFast
335#if ADAPTIVE_QP_SELECTION                 
336                  , m_bUseAdaptQpSelect
337#endif
338                  );
339 
340  // initialize encoder search class
341  m_cSearch.init( this, &m_cTrQuant, m_iSearchRange, m_bipredSearchRange, m_iFastSearch, 0, &m_cEntropyCoder, &m_cRdCost, getRDSbacCoder(), getRDGoOnSbacCoder() );
342
343  m_iMaxRefPicNum = 0;
344#if SVC_EXTENSION
345  m_iSPSIdCnt ++;
346  m_iPPSIdCnt ++;
347#endif
348#if REF_IDX_FRAMEWORK
349  xInitILRP();
350#endif
351}
352
353// ====================================================================================================================
354// Public member functions
355// ====================================================================================================================
356
357Void TEncTop::deletePicBuffer()
358{
359  TComList<TComPic*>::iterator iterPic = m_cListPic.begin();
360  Int iSize = Int( m_cListPic.size() );
361 
362  for ( Int i = 0; i < iSize; i++ )
363  {
364    TComPic* pcPic = *(iterPic++);
365   
366    pcPic->destroy();
367    delete pcPic;
368    pcPic = NULL;
369  }
370}
371
372/**
373 - Application has picture buffer list with size of GOP + 1
374 - Picture buffer list acts like as ring buffer
375 - End of the list has the latest picture
376 .
377 \param   flush               cause encoder to encode a partial GOP
378 \param   pcPicYuvOrg         original YUV picture
379 \retval  rcListPicYuvRecOut  list of reconstruction YUV pictures
380 \retval  rcListBitstreamOut  list of output bitstreams
381 \retval  iNumEncoded         number of encoded pictures
382 */
383#if SVC_EXTENSION
384Void TEncTop::encode( TComPicYuv* pcPicYuvOrg, TComList<TComPicYuv*>& rcListPicYuvRecOut, std::list<AccessUnit>& accessUnitsOut, Int iPicIdInGOP )
385{
386  // compress GOP
387#if RATE_CONTROL_LAMBDA_DOMAIN
388  if ( m_RCEnableRateControl )
389  {
390    m_cRateCtrl.initRCGOP( m_iNumPicRcvd );
391  }
392#endif
393
394  // compress GOP
395  m_cGOPEncoder.compressGOP(iPicIdInGOP, m_iPOCLast, m_iNumPicRcvd, m_cListPic, rcListPicYuvRecOut, accessUnitsOut);
396
397#if RATE_CONTROL_LAMBDA_DOMAIN
398  if ( m_RCEnableRateControl )
399  {
400    m_cRateCtrl.destroyRCGOP();
401  }
402#endif
403 
404  m_uiNumAllPicCoded ++;
405}
406
407Void TEncTop::encodePrep( TComPicYuv* pcPicYuvOrg )
408{
409  if (pcPicYuvOrg) 
410  {
411    // get original YUV
412    TComPic* pcPicCurr = NULL;
413    xGetNewPicBuffer( pcPicCurr );
414    pcPicYuvOrg->copyToPic( pcPicCurr->getPicYuvOrg() );
415
416    // compute image characteristics
417    if ( getUseAdaptiveQP() )
418    {
419      m_cPreanalyzer.xPreanalyze( dynamic_cast<TEncPic*>( pcPicCurr ) );
420    }
421  }
422}
423#else
424Void TEncTop::encode(Bool flush, TComPicYuv* pcPicYuvOrg, TComList<TComPicYuv*>& rcListPicYuvRecOut, std::list<AccessUnit>& accessUnitsOut, Int& iNumEncoded )
425{
426  if (pcPicYuvOrg) {
427    // get original YUV
428    TComPic* pcPicCurr = NULL;
429    xGetNewPicBuffer( pcPicCurr );
430    pcPicYuvOrg->copyToPic( pcPicCurr->getPicYuvOrg() );
431
432    // compute image characteristics
433    if ( getUseAdaptiveQP() )
434    {
435      m_cPreanalyzer.xPreanalyze( dynamic_cast<TEncPic*>( pcPicCurr ) );
436    }
437  }
438 
439  if (!m_iNumPicRcvd || (!flush && m_iPOCLast != 0 && m_iNumPicRcvd != m_iGOPSize && m_iGOPSize))
440  {
441    iNumEncoded = 0;
442    return;
443  }
444 
445#if RATE_CONTROL_LAMBDA_DOMAIN
446  if ( m_RCEnableRateControl )
447  {
448    m_cRateCtrl.initRCGOP( m_iNumPicRcvd );
449  }
450#endif
451
452  // compress GOP
453  m_cGOPEncoder.compressGOP(m_iPOCLast, m_iNumPicRcvd, m_cListPic, rcListPicYuvRecOut, accessUnitsOut);
454
455#if RATE_CONTROL_LAMBDA_DOMAIN
456  if ( m_RCEnableRateControl )
457  {
458    m_cRateCtrl.destroyRCGOP();
459  }
460#endif
461 
462  iNumEncoded         = m_iNumPicRcvd;
463  m_iNumPicRcvd       = 0;
464  m_uiNumAllPicCoded += iNumEncoded;
465}
466#endif
467
468// ====================================================================================================================
469// Protected member functions
470// ====================================================================================================================
471
472/**
473 - Application has picture buffer list with size of GOP + 1
474 - Picture buffer list acts like as ring buffer
475 - End of the list has the latest picture
476 .
477 \retval rpcPic obtained picture buffer
478 */
479Void TEncTop::xGetNewPicBuffer ( TComPic*& rpcPic )
480{
481  TComSlice::sortPicList(m_cListPic);
482 
483  if (m_cListPic.size() >= (UInt)(m_iGOPSize + getMaxDecPicBuffering(MAX_TLAYER-1) + 2) )
484  {
485    TComList<TComPic*>::iterator iterPic  = m_cListPic.begin();
486    Int iSize = Int( m_cListPic.size() );
487    for ( Int i = 0; i < iSize; i++ )
488    {
489      rpcPic = *(iterPic++);
490      if(rpcPic->getSlice(0)->isReferenced() == false)
491      {
492        break;
493      }
494    }
495  }
496  else
497  {
498    if ( getUseAdaptiveQP() )
499    {
500      TEncPic* pcEPic = new TEncPic;
501
502#if SVC_EXTENSION //Temporal solution, should be modified
503      if(m_layerId > 0)
504      {
505#if VPS_EXTN_DIRECT_REF_LAYERS_CONTINUE
506        TEncTop *pcEncTopBase = (TEncTop *)getRefLayerEnc( m_layerId );
507#else
508        TEncTop *pcEncTopBase = (TEncTop *)getLayerEnc( m_layerId-1 );
509#endif
510        if(m_iSourceWidth != pcEncTopBase->getSourceWidth() || m_iSourceHeight != pcEncTopBase->getSourceHeight() )
511        {
512          pcEPic->setSpatialEnhLayerFlag( true );
513        }
514      }
515#endif
516
517#if SVC_UPSAMPLING
518      pcEPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, m_cPPS.getMaxCuDQPDepth()+1 ,
519                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics, &m_cSPS);
520#else
521      pcEPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, m_cPPS.getMaxCuDQPDepth()+1 ,
522                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics);
523#endif
524      rpcPic = pcEPic;
525    }
526    else
527    {
528      rpcPic = new TComPic;
529
530#if SVC_EXTENSION //Temporal solution, should be modified
531      if(m_layerId > 0)
532      {
533#if VPS_EXTN_DIRECT_REF_LAYERS_CONTINUE
534        TEncTop *pcEncTopBase = (TEncTop *)getRefLayerEnc( m_layerId );
535#else
536        TEncTop *pcEncTopBase = (TEncTop *)getLayerEnc( m_layerId-1 );
537#endif
538        if(m_iSourceWidth != pcEncTopBase->getSourceWidth() || m_iSourceHeight != pcEncTopBase->getSourceHeight() )
539        {
540          rpcPic->setSpatialEnhLayerFlag( true );
541        }
542      }
543#endif
544
545#if SVC_UPSAMPLING
546      rpcPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, 
547                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics, &m_cSPS);
548#else
549      rpcPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, 
550                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics);
551#endif
552    }
553
554    if (getUseSAO())
555    {
556      rpcPic->getPicSym()->allocSaoParam(&m_cEncSAO);
557    }
558    m_cListPic.pushBack( rpcPic );
559  }
560  rpcPic->setReconMark (false);
561 
562  m_iPOCLast++;
563  m_iNumPicRcvd++;
564 
565  rpcPic->getSlice(0)->setPOC( m_iPOCLast );
566  // mark it should be extended
567  rpcPic->getPicYuvRec()->setBorderExtension(false);
568}
569
570Void TEncTop::xInitSPS()
571{
572#if SVC_EXTENSION
573  m_cSPS.setLayerId(m_layerId);
574#endif
575#if REF_IDX_MFM
576  m_cSPS.setMFMEnabledFlag(m_bMFMEnabledFlag);
577#endif
578#if SCALED_REF_LAYER_OFFSETS
579  m_cSPS.getScaledRefLayerWindow() = m_scaledRefLayerWindow;
580#endif
581  ProfileTierLevel& profileTierLevel = *m_cSPS.getPTL()->getGeneralPTL();
582  profileTierLevel.setLevelIdc(m_level);
583  profileTierLevel.setTierFlag(m_levelTier);
584  profileTierLevel.setProfileIdc(m_profile);
585  profileTierLevel.setProfileCompatibilityFlag(m_profile, 1);
586#if L0046_CONSTRAINT_FLAGS
587  profileTierLevel.setProgressiveSourceFlag(m_progressiveSourceFlag);
588  profileTierLevel.setInterlacedSourceFlag(m_interlacedSourceFlag);
589  profileTierLevel.setNonPackedConstraintFlag(m_nonPackedConstraintFlag);
590  profileTierLevel.setFrameOnlyConstraintFlag(m_frameOnlyConstraintFlag);
591#endif
592 
593  if (m_profile == Profile::MAIN10 && g_bitDepthY == 8 && g_bitDepthC == 8)
594  {
595    /* The above constraint is equal to Profile::MAIN */
596    profileTierLevel.setProfileCompatibilityFlag(Profile::MAIN, 1);
597  }
598  if (m_profile == Profile::MAIN)
599  {
600    /* A Profile::MAIN10 decoder can always decode Profile::MAIN */
601    profileTierLevel.setProfileCompatibilityFlag(Profile::MAIN10, 1);
602  }
603  /* XXX: should Main be marked as compatible with still picture? */
604  /* XXX: may be a good idea to refactor the above into a function
605   * that chooses the actual compatibility based upon options */
606
607  m_cSPS.setPicWidthInLumaSamples         ( m_iSourceWidth      );
608  m_cSPS.setPicHeightInLumaSamples        ( m_iSourceHeight     );
609  m_cSPS.setConformanceWindow             ( m_conformanceWindow );
610  m_cSPS.setMaxCUWidth    ( g_uiMaxCUWidth      );
611  m_cSPS.setMaxCUHeight   ( g_uiMaxCUHeight     );
612  m_cSPS.setMaxCUDepth    ( g_uiMaxCUDepth      );
613
614  Int minCUSize = m_cSPS.getMaxCUWidth() >> ( m_cSPS.getMaxCUDepth()-g_uiAddCUDepth );
615  Int log2MinCUSize = 0;
616  while(minCUSize > 1)
617  {
618    minCUSize >>= 1;
619    log2MinCUSize++;
620  }
621
622  m_cSPS.setLog2MinCodingBlockSize(log2MinCUSize);
623  m_cSPS.setLog2DiffMaxMinCodingBlockSize(m_cSPS.getMaxCUDepth()-g_uiAddCUDepth);
624#if SVC_EXTENSION
625  m_cSPS.setSPSId         ( m_iSPSIdCnt       );
626#endif
627 
628  m_cSPS.setPCMLog2MinSize (m_uiPCMLog2MinSize);
629  m_cSPS.setUsePCM        ( m_usePCM           );
630  m_cSPS.setPCMLog2MaxSize( m_pcmLog2MaxSize  );
631
632  m_cSPS.setQuadtreeTULog2MaxSize( m_uiQuadtreeTULog2MaxSize );
633  m_cSPS.setQuadtreeTULog2MinSize( m_uiQuadtreeTULog2MinSize );
634  m_cSPS.setQuadtreeTUMaxDepthInter( m_uiQuadtreeTUMaxDepthInter    );
635  m_cSPS.setQuadtreeTUMaxDepthIntra( m_uiQuadtreeTUMaxDepthIntra    );
636 
637  m_cSPS.setTMVPFlagsPresent(false);
638  m_cSPS.setUseLossless   ( m_useLossless  );
639
640  m_cSPS.setMaxTrSize   ( 1 << m_uiQuadtreeTULog2MaxSize );
641#if !L0034_COMBINED_LIST_CLEANUP
642  m_cSPS.setUseLComb    ( m_bUseLComb           );
643#endif
644 
645  Int i;
646 
647  for (i = 0; i < g_uiMaxCUDepth-g_uiAddCUDepth; i++ )
648  {
649    m_cSPS.setAMPAcc( i, m_useAMP );
650    //m_cSPS.setAMPAcc( i, 1 );
651  }
652
653  m_cSPS.setUseAMP ( m_useAMP );
654
655  for (i = g_uiMaxCUDepth-g_uiAddCUDepth; i < g_uiMaxCUDepth; i++ )
656  {
657    m_cSPS.setAMPAcc(i, 0);
658  }
659
660  m_cSPS.setBitDepthY( g_bitDepthY );
661  m_cSPS.setBitDepthC( g_bitDepthC );
662
663  m_cSPS.setQpBDOffsetY ( 6*(g_bitDepthY - 8) );
664  m_cSPS.setQpBDOffsetC ( 6*(g_bitDepthC - 8) );
665
666  m_cSPS.setUseSAO( m_bUseSAO );
667
668  m_cSPS.setMaxTLayers( m_maxTempLayer );
669  m_cSPS.setTemporalIdNestingFlag( ( m_maxTempLayer == 1 ) ? true : false );
670  for ( i = 0; i < m_cSPS.getMaxTLayers(); i++ )
671  {
672    m_cSPS.setMaxDecPicBuffering(m_maxDecPicBuffering[i], i);
673    m_cSPS.setNumReorderPics(m_numReorderPics[i], i);
674  }
675  m_cSPS.setPCMBitDepthLuma (g_uiPCMBitDepthLuma);
676  m_cSPS.setPCMBitDepthChroma (g_uiPCMBitDepthChroma);
677  m_cSPS.setPCMFilterDisableFlag  ( m_bPCMFilterDisableFlag );
678
679  m_cSPS.setScalingListFlag ( (m_useScalingListId == 0) ? 0 : 1 );
680
681  m_cSPS.setUseStrongIntraSmoothing( m_useStrongIntraSmoothing );
682
683  m_cSPS.setVuiParametersPresentFlag(getVuiParametersPresentFlag());
684  if (m_cSPS.getVuiParametersPresentFlag())
685  {
686    TComVUI* pcVUI = m_cSPS.getVuiParameters();
687    pcVUI->setAspectRatioInfoPresentFlag(getAspectRatioIdc() != -1);
688    pcVUI->setAspectRatioIdc(getAspectRatioIdc());
689    pcVUI->setSarWidth(getSarWidth());
690    pcVUI->setSarHeight(getSarHeight());
691    pcVUI->setOverscanInfoPresentFlag(getOverscanInfoPresentFlag());
692    pcVUI->setOverscanAppropriateFlag(getOverscanAppropriateFlag());
693    pcVUI->setVideoSignalTypePresentFlag(getVideoSignalTypePresentFlag());
694    pcVUI->setVideoFormat(getVideoFormat());
695    pcVUI->setVideoFullRangeFlag(getVideoFullRangeFlag());
696    pcVUI->setColourDescriptionPresentFlag(getColourDescriptionPresentFlag());
697    pcVUI->setColourPrimaries(getColourPrimaries());
698    pcVUI->setTransferCharacteristics(getTransferCharacteristics());
699    pcVUI->setMatrixCoefficients(getMatrixCoefficients());
700    pcVUI->setChromaLocInfoPresentFlag(getChromaLocInfoPresentFlag());
701    pcVUI->setChromaSampleLocTypeTopField(getChromaSampleLocTypeTopField());
702    pcVUI->setChromaSampleLocTypeBottomField(getChromaSampleLocTypeBottomField());
703    pcVUI->setNeutralChromaIndicationFlag(getNeutralChromaIndicationFlag());
704    pcVUI->setDefaultDisplayWindow(getDefaultDisplayWindow());
705    pcVUI->setFrameFieldInfoPresentFlag(getFrameFieldInfoPresentFlag());
706    pcVUI->setFieldSeqFlag(false);
707    pcVUI->setHrdParametersPresentFlag(false);
708#if L0043_TIMING_INFO
709    pcVUI->getTimingInfo()->setPocProportionalToTimingFlag(getPocProportionalToTimingFlag());
710    pcVUI->getTimingInfo()->setNumTicksPocDiffOneMinus1   (getNumTicksPocDiffOneMinus1()   );
711#else
712    pcVUI->setPocProportionalToTimingFlag(getPocProportionalToTimingFlag());
713    pcVUI->setNumTicksPocDiffOneMinus1   (getNumTicksPocDiffOneMinus1()   );
714#endif
715    pcVUI->setBitstreamRestrictionFlag(getBitstreamRestrictionFlag());
716    pcVUI->setTilesFixedStructureFlag(getTilesFixedStructureFlag());
717    pcVUI->setMotionVectorsOverPicBoundariesFlag(getMotionVectorsOverPicBoundariesFlag());
718    pcVUI->setMinSpatialSegmentationIdc(getMinSpatialSegmentationIdc());
719    pcVUI->setMaxBytesPerPicDenom(getMaxBytesPerPicDenom());
720    pcVUI->setMaxBitsPerMinCuDenom(getMaxBitsPerMinCuDenom());
721    pcVUI->setLog2MaxMvLengthHorizontal(getLog2MaxMvLengthHorizontal());
722    pcVUI->setLog2MaxMvLengthVertical(getLog2MaxMvLengthVertical());
723  }
724}
725
726Void TEncTop::xInitPPS()
727{
728  m_cPPS.setConstrainedIntraPred( m_bUseConstrainedIntraPred );
729  Bool bUseDQP = (getMaxCuDQPDepth() > 0)? true : false;
730
731  Int lowestQP = - m_cSPS.getQpBDOffsetY();
732
733  if(getUseLossless())
734  {
735    if ((getMaxCuDQPDepth() == 0) && (getMaxDeltaQP() == 0 ) && (getQP() == lowestQP) )
736    {
737      bUseDQP = false;
738    }
739    else
740    {
741      bUseDQP = true;
742    }
743  }
744  else
745  {
746    if(bUseDQP == false)
747    {
748      if((getMaxDeltaQP() != 0 )|| getUseAdaptiveQP())
749      {
750        bUseDQP = true;
751      }
752    }
753  }
754
755  if(bUseDQP)
756  {
757    m_cPPS.setUseDQP(true);
758    m_cPPS.setMaxCuDQPDepth( m_iMaxCuDQPDepth );
759    m_cPPS.setMinCuDQPSize( m_cPPS.getSPS()->getMaxCUWidth() >> ( m_cPPS.getMaxCuDQPDepth()) );
760  }
761  else
762  {
763    m_cPPS.setUseDQP(false);
764    m_cPPS.setMaxCuDQPDepth( 0 );
765    m_cPPS.setMinCuDQPSize( m_cPPS.getSPS()->getMaxCUWidth() >> ( m_cPPS.getMaxCuDQPDepth()) );
766  }
767
768#if RATE_CONTROL_LAMBDA_DOMAIN
769  if ( m_RCEnableRateControl )
770  {
771    m_cPPS.setUseDQP(true);
772    m_cPPS.setMaxCuDQPDepth( 0 );
773    m_cPPS.setMinCuDQPSize( m_cPPS.getSPS()->getMaxCUWidth() >> ( m_cPPS.getMaxCuDQPDepth()) );
774  } 
775#endif
776
777  m_cPPS.setChromaCbQpOffset( m_chromaCbQpOffset );
778  m_cPPS.setChromaCrQpOffset( m_chromaCrQpOffset );
779
780  m_cPPS.setNumSubstreams(m_iWaveFrontSubstreams);
781  m_cPPS.setEntropyCodingSyncEnabledFlag( m_iWaveFrontSynchro > 0 );
782  m_cPPS.setTilesEnabledFlag( (m_iNumColumnsMinus1 > 0 || m_iNumRowsMinus1 > 0) );
783  m_cPPS.setUseWP( m_useWeightedPred );
784  m_cPPS.setWPBiPred( m_useWeightedBiPred );
785  m_cPPS.setOutputFlagPresentFlag( false );
786  m_cPPS.setSignHideFlag(getSignHideFlag());
787#if L0386_DB_METRIC
788  if ( getDeblockingFilterMetric() )
789  {
790    m_cPPS.setDeblockingFilterControlPresentFlag (true);
791    m_cPPS.setDeblockingFilterOverrideEnabledFlag(true);
792    m_cPPS.setPicDisableDeblockingFilterFlag(false);
793    m_cPPS.setDeblockingFilterBetaOffsetDiv2(0);
794    m_cPPS.setDeblockingFilterTcOffsetDiv2(0);
795  } 
796  else
797  {
798  m_cPPS.setDeblockingFilterControlPresentFlag (m_DeblockingFilterControlPresent );
799  }
800#else
801  m_cPPS.setDeblockingFilterControlPresentFlag (m_DeblockingFilterControlPresent );
802#endif
803  m_cPPS.setLog2ParallelMergeLevelMinus2   (m_log2ParallelMergeLevelMinus2 );
804  m_cPPS.setCabacInitPresentFlag(CABAC_INIT_PRESENT_FLAG);
805  m_cPPS.setLoopFilterAcrossSlicesEnabledFlag( m_bLFCrossSliceBoundaryFlag );
806  Int histogram[MAX_NUM_REF + 1];
807  for( Int i = 0; i <= MAX_NUM_REF; i++ )
808  {
809    histogram[i]=0;
810  }
811  for( Int i = 0; i < getGOPSize(); i++ )
812  {
813    assert(getGOPEntry(i).m_numRefPicsActive >= 0 && getGOPEntry(i).m_numRefPicsActive <= MAX_NUM_REF);
814    histogram[getGOPEntry(i).m_numRefPicsActive]++;
815  }
816  Int maxHist=-1;
817  Int bestPos=0;
818  for( Int i = 0; i <= MAX_NUM_REF; i++ )
819  {
820    if(histogram[i]>maxHist)
821    {
822      maxHist=histogram[i];
823      bestPos=i;
824    }
825  }
826#if L0323_LIMIT_DEFAULT_LIST_SIZE
827  assert(bestPos <= 15);
828#endif
829  m_cPPS.setNumRefIdxL0DefaultActive(bestPos);
830  m_cPPS.setNumRefIdxL1DefaultActive(bestPos);
831  m_cPPS.setTransquantBypassEnableFlag(getTransquantBypassEnableFlag());
832  m_cPPS.setUseTransformSkip( m_useTransformSkip );
833  if (m_sliceSegmentMode)
834  {
835    m_cPPS.setDependentSliceSegmentsEnabledFlag( true );
836  }
837  if( m_cPPS.getDependentSliceSegmentsEnabledFlag() )
838  {
839    Int NumCtx = m_cPPS.getEntropyCodingSyncEnabledFlag()?2:1;
840    m_cSliceEncoder.initCtxMem( NumCtx );
841    for ( UInt st = 0; st < NumCtx; st++ )
842    {
843      TEncSbac* ctx = NULL;
844      ctx = new TEncSbac;
845      ctx->init( &m_cBinCoderCABAC );
846      m_cSliceEncoder.setCtxMem( ctx, st );
847    }
848  }
849#if REF_IDX_FRAMEWORK
850  if (!m_layerId)
851  {
852    m_cPPS.setListsModificationPresentFlag(false);
853  }
854  else
855  {
856    m_cPPS.setListsModificationPresentFlag(true);
857  }
858#endif
859#if SVC_EXTENSION
860  m_cPPS.setPPSId         ( m_iPPSIdCnt         );
861  m_cPPS.setSPSId         ( m_iSPSIdCnt         );
862#endif
863}
864
865//Function for initializing m_RPSList, a list of TComReferencePictureSet, based on the GOPEntry objects read from the config file.
866Void TEncTop::xInitRPS()
867{
868  TComReferencePictureSet*      rps;
869 
870  m_cSPS.createRPSList(getGOPSize()+m_extraRPSs);
871  TComRPSList* rpsList = m_cSPS.getRPSList();
872
873  for( Int i = 0; i < getGOPSize()+m_extraRPSs; i++) 
874  {
875    GOPEntry ge = getGOPEntry(i);
876    rps = rpsList->getReferencePictureSet(i);
877    rps->setNumberOfPictures(ge.m_numRefPics);
878    rps->setNumRefIdc(ge.m_numRefIdc);
879    Int numNeg = 0;
880    Int numPos = 0;
881    for( Int j = 0; j < ge.m_numRefPics; j++)
882    {
883      rps->setDeltaPOC(j,ge.m_referencePics[j]);
884      rps->setUsed(j,ge.m_usedByCurrPic[j]);
885      if(ge.m_referencePics[j]>0)
886      {
887        numPos++;
888      }
889      else
890      {
891        numNeg++;
892      }
893    }
894    rps->setNumberOfNegativePictures(numNeg);
895    rps->setNumberOfPositivePictures(numPos);
896
897    // handle inter RPS intialization from the config file.
898#if AUTO_INTER_RPS
899    rps->setInterRPSPrediction(ge.m_interRPSPrediction > 0);  // not very clean, converting anything > 0 to true.
900    rps->setDeltaRIdxMinus1(0);                               // index to the Reference RPS is always the previous one.
901    TComReferencePictureSet*     RPSRef = rpsList->getReferencePictureSet(i-1);  // get the reference RPS
902
903    if (ge.m_interRPSPrediction == 2)  // Automatic generation of the inter RPS idc based on the RIdx provided.
904    {
905      Int deltaRPS = getGOPEntry(i-1).m_POC - ge.m_POC;  // the ref POC - current POC
906      Int numRefDeltaPOC = RPSRef->getNumberOfPictures();
907
908      rps->setDeltaRPS(deltaRPS);           // set delta RPS
909      rps->setNumRefIdc(numRefDeltaPOC+1);  // set the numRefIdc to the number of pictures in the reference RPS + 1.
910      Int count=0;
911      for (Int j = 0; j <= numRefDeltaPOC; j++ ) // cycle through pics in reference RPS.
912      {
913        Int RefDeltaPOC = (j<numRefDeltaPOC)? RPSRef->getDeltaPOC(j): 0;  // if it is the last decoded picture, set RefDeltaPOC = 0
914        rps->setRefIdc(j, 0);
915        for (Int k = 0; k < rps->getNumberOfPictures(); k++ )  // cycle through pics in current RPS.
916        {
917          if (rps->getDeltaPOC(k) == ( RefDeltaPOC + deltaRPS))  // if the current RPS has a same picture as the reference RPS.
918          {
919              rps->setRefIdc(j, (rps->getUsed(k)?1:2));
920              count++;
921              break;
922          }
923        }
924      }
925      if (count != rps->getNumberOfPictures())
926      {
927        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");
928        rps->setInterRPSPrediction(0);
929      }
930    }
931    else if (ge.m_interRPSPrediction == 1)  // inter RPS idc based on the RefIdc values provided in config file.
932    {
933      rps->setDeltaRPS(ge.m_deltaRPS);
934      rps->setNumRefIdc(ge.m_numRefIdc);
935      for (Int j = 0; j < ge.m_numRefIdc; j++ )
936      {
937        rps->setRefIdc(j, ge.m_refIdc[j]);
938      }
939#if WRITE_BACK
940      // the folowing code overwrite the deltaPOC and Used by current values read from the config file with the ones
941      // computed from the RefIdc.  A warning is printed if they are not identical.
942      numNeg = 0;
943      numPos = 0;
944      TComReferencePictureSet      RPSTemp;  // temporary variable
945
946      for (Int j = 0; j < ge.m_numRefIdc; j++ )
947      {
948        if (ge.m_refIdc[j])
949        {
950          Int deltaPOC = ge.m_deltaRPS + ((j < RPSRef->getNumberOfPictures())? RPSRef->getDeltaPOC(j) : 0);
951          RPSTemp.setDeltaPOC((numNeg+numPos),deltaPOC);
952          RPSTemp.setUsed((numNeg+numPos),ge.m_refIdc[j]==1?1:0);
953          if (deltaPOC<0)
954          {
955            numNeg++;
956          }
957          else
958          {
959            numPos++;
960          }
961        }
962      }
963      if (numNeg != rps->getNumberOfNegativePictures())
964      {
965        printf("Warning: number of negative pictures in RPS is different between intra and inter RPS specified in the config file.\n");
966        rps->setNumberOfNegativePictures(numNeg);
967        rps->setNumberOfPositivePictures(numNeg+numPos);
968      }
969      if (numPos != rps->getNumberOfPositivePictures())
970      {
971        printf("Warning: number of positive pictures in RPS is different between intra and inter RPS specified in the config file.\n");
972        rps->setNumberOfPositivePictures(numPos);
973        rps->setNumberOfPositivePictures(numNeg+numPos);
974      }
975      RPSTemp.setNumberOfPictures(numNeg+numPos);
976      RPSTemp.setNumberOfNegativePictures(numNeg);
977      RPSTemp.sortDeltaPOC();     // sort the created delta POC before comparing
978      // check if Delta POC and Used are the same
979      // print warning if they are not.
980      for (Int j = 0; j < ge.m_numRefIdc; j++ )
981      {
982        if (RPSTemp.getDeltaPOC(j) != rps->getDeltaPOC(j))
983        {
984          printf("Warning: delta POC is different between intra RPS and inter RPS specified in the config file.\n");
985          rps->setDeltaPOC(j,RPSTemp.getDeltaPOC(j));
986        }
987        if (RPSTemp.getUsed(j) != rps->getUsed(j))
988        {
989          printf("Warning: Used by Current in RPS is different between intra and inter RPS specified in the config file.\n");
990          rps->setUsed(j,RPSTemp.getUsed(j));
991        }
992      }
993#endif
994    }
995#else
996    rps->setInterRPSPrediction(ge.m_interRPSPrediction);
997    if (ge.m_interRPSPrediction)
998    {
999      rps->setDeltaRIdxMinus1(0);
1000      rps->setDeltaRPS(ge.m_deltaRPS);
1001      rps->setNumRefIdc(ge.m_numRefIdc);
1002      for (Int j = 0; j < ge.m_numRefIdc; j++ )
1003      {
1004        rps->setRefIdc(j, ge.m_refIdc[j]);
1005      }
1006#if WRITE_BACK
1007      // the folowing code overwrite the deltaPOC and Used by current values read from the config file with the ones
1008      // computed from the RefIdc.  This is not necessary if both are identical. Currently there is no check to see if they are identical.
1009      numNeg = 0;
1010      numPos = 0;
1011      TComReferencePictureSet*     RPSRef = m_RPSList.getReferencePictureSet(i-1);
1012
1013      for (Int j = 0; j < ge.m_numRefIdc; j++ )
1014      {
1015        if (ge.m_refIdc[j])
1016        {
1017          Int deltaPOC = ge.m_deltaRPS + ((j < RPSRef->getNumberOfPictures())? RPSRef->getDeltaPOC(j) : 0);
1018          rps->setDeltaPOC((numNeg+numPos),deltaPOC);
1019          rps->setUsed((numNeg+numPos),ge.m_refIdc[j]==1?1:0);
1020          if (deltaPOC<0)
1021          {
1022            numNeg++;
1023          }
1024          else
1025          {
1026            numPos++;
1027          }
1028        }
1029      }
1030      rps->setNumberOfNegativePictures(numNeg);
1031      rps->setNumberOfPositivePictures(numPos);
1032      rps->sortDeltaPOC();
1033#endif
1034    }
1035#endif //INTER_RPS_AUTO
1036  }
1037 
1038}
1039
1040   // This is a function that
1041   // determines what Reference Picture Set to use
1042   // for a specific slice (with POC = POCCurr)
1043Void TEncTop::selectReferencePictureSet(TComSlice* slice, Int POCCurr, Int GOPid )
1044{
1045  slice->setRPSidx(GOPid);
1046
1047  for(Int extraNum=m_iGOPSize; extraNum<m_extraRPSs+m_iGOPSize; extraNum++)
1048  {   
1049    if(m_uiIntraPeriod > 0 && getDecodingRefreshType() > 0)
1050    {
1051      Int POCIndex = POCCurr%m_uiIntraPeriod;
1052      if(POCIndex == 0)
1053      {
1054        POCIndex = m_uiIntraPeriod;
1055      }
1056      if(POCIndex == m_GOPList[extraNum].m_POC)
1057      {
1058        slice->setRPSidx(extraNum);
1059      }
1060    }
1061    else
1062    {
1063      if(POCCurr==m_GOPList[extraNum].m_POC)
1064      {
1065        slice->setRPSidx(extraNum);
1066      }
1067    }
1068  }
1069
1070  slice->setRPS(getSPS()->getRPSList()->getReferencePictureSet(slice->getRPSidx()));
1071  slice->getRPS()->setNumberOfPictures(slice->getRPS()->getNumberOfNegativePictures()+slice->getRPS()->getNumberOfPositivePictures());
1072
1073}
1074
1075#if L0208_SOP_DESCRIPTION_SEI
1076Int TEncTop::getReferencePictureSetIdxForSOP(TComSlice* slice, Int POCCurr, Int GOPid )
1077{
1078  int rpsIdx = GOPid;
1079
1080  for(Int extraNum=m_iGOPSize; extraNum<m_extraRPSs+m_iGOPSize; extraNum++)
1081  {   
1082    if(m_uiIntraPeriod > 0 && getDecodingRefreshType() > 0)
1083    {
1084      Int POCIndex = POCCurr%m_uiIntraPeriod;
1085      if(POCIndex == 0)
1086      {
1087        POCIndex = m_uiIntraPeriod;
1088      }
1089      if(POCIndex == m_GOPList[extraNum].m_POC)
1090      {
1091        rpsIdx = extraNum;
1092      }
1093    }
1094    else
1095    {
1096      if(POCCurr==m_GOPList[extraNum].m_POC)
1097      {
1098        rpsIdx = extraNum;
1099      }
1100    }
1101  }
1102
1103  return rpsIdx;
1104}
1105#endif
1106
1107Void  TEncTop::xInitPPSforTiles()
1108{
1109  m_cPPS.setUniformSpacingFlag( m_iUniformSpacingIdr );
1110  m_cPPS.setNumColumnsMinus1( m_iNumColumnsMinus1 );
1111  m_cPPS.setNumRowsMinus1( m_iNumRowsMinus1 );
1112  if( m_iUniformSpacingIdr == 0 )
1113  {
1114    m_cPPS.setColumnWidth( m_puiColumnWidth );
1115    m_cPPS.setRowHeight( m_puiRowHeight );
1116  }
1117  m_cPPS.setLoopFilterAcrossTilesEnabledFlag( m_loopFilterAcrossTilesEnabledFlag );
1118
1119  // # substreams is "per tile" when tiles are independent.
1120  if (m_iWaveFrontSynchro
1121    )
1122  {
1123    m_cPPS.setNumSubstreams(m_iWaveFrontSubstreams * (m_iNumColumnsMinus1+1));
1124  }
1125}
1126
1127Void  TEncCfg::xCheckGSParameters()
1128{
1129  Int   iWidthInCU = ( m_iSourceWidth%g_uiMaxCUWidth ) ? m_iSourceWidth/g_uiMaxCUWidth + 1 : m_iSourceWidth/g_uiMaxCUWidth;
1130  Int   iHeightInCU = ( m_iSourceHeight%g_uiMaxCUHeight ) ? m_iSourceHeight/g_uiMaxCUHeight + 1 : m_iSourceHeight/g_uiMaxCUHeight;
1131  UInt  uiCummulativeColumnWidth = 0;
1132  UInt  uiCummulativeRowHeight = 0;
1133
1134  //check the column relative parameters
1135  if( m_iNumColumnsMinus1 >= (1<<(LOG2_MAX_NUM_COLUMNS_MINUS1+1)) )
1136  {
1137    printf( "The number of columns is larger than the maximum allowed number of columns.\n" );
1138    exit( EXIT_FAILURE );
1139  }
1140
1141  if( m_iNumColumnsMinus1 >= iWidthInCU )
1142  {
1143    printf( "The current picture can not have so many columns.\n" );
1144    exit( EXIT_FAILURE );
1145  }
1146
1147  if( m_iNumColumnsMinus1 && m_iUniformSpacingIdr==0 )
1148  {
1149    for(Int i=0; i<m_iNumColumnsMinus1; i++)
1150    {
1151      uiCummulativeColumnWidth += m_puiColumnWidth[i];
1152    }
1153
1154    if( uiCummulativeColumnWidth >= iWidthInCU )
1155    {
1156      printf( "The width of the column is too large.\n" );
1157      exit( EXIT_FAILURE );
1158    }
1159  }
1160
1161  //check the row relative parameters
1162  if( m_iNumRowsMinus1 >= (1<<(LOG2_MAX_NUM_ROWS_MINUS1+1)) )
1163  {
1164    printf( "The number of rows is larger than the maximum allowed number of rows.\n" );
1165    exit( EXIT_FAILURE );
1166  }
1167
1168  if( m_iNumRowsMinus1 >= iHeightInCU )
1169  {
1170    printf( "The current picture can not have so many rows.\n" );
1171    exit( EXIT_FAILURE );
1172  }
1173
1174  if( m_iNumRowsMinus1 && m_iUniformSpacingIdr==0 )
1175  {
1176    for(Int i=0; i<m_iNumRowsMinus1; i++)
1177    {
1178      uiCummulativeRowHeight += m_puiRowHeight[i];
1179    }
1180
1181    if( uiCummulativeRowHeight >= iHeightInCU )
1182    {
1183      printf( "The height of the row is too large.\n" );
1184      exit( EXIT_FAILURE );
1185    }
1186  }
1187}
1188
1189#if SVC_EXTENSION
1190#if VPS_EXTN_DIRECT_REF_LAYERS_CONTINUE
1191TEncTop* TEncTop::getRefLayerEnc( UInt layerId )
1192{
1193  if( m_ppcTEncTop[m_layerId]->getNumDirectRefLayers() <= 0 )
1194  {
1195#if ZERO_NUM_DIRECT_LAYERS
1196    return (TEncTop *)getLayerEnc( 0 );
1197#else
1198    return NULL;
1199#endif
1200  }
1201
1202  // currently only one reference layer is supported
1203  assert( m_ppcTEncTop[m_layerId]->getNumDirectRefLayers() == 1 );
1204
1205  return (TEncTop *)getLayerEnc( getVPS()->getRefLayerId( m_layerId, 0 ) );
1206}
1207#endif
1208
1209#if REF_IDX_FRAMEWORK
1210Void TEncTop::xInitILRP()
1211{
1212  if(m_layerId>0)
1213  {
1214    g_bitDepthY     = m_cSPS.getBitDepthY();
1215    g_bitDepthC     = m_cSPS.getBitDepthC();
1216    g_uiMaxCUWidth  = m_cSPS.getMaxCUWidth();
1217    g_uiMaxCUHeight = m_cSPS.getMaxCUHeight();
1218    g_uiMaxCUDepth  = m_cSPS.getMaxCUDepth();
1219    g_uiAddCUDepth  = max (0, m_cSPS.getLog2MinCodingBlockSize() - (Int)m_cSPS.getQuadtreeTULog2MinSize() );
1220
1221    Int  numReorderPics[MAX_TLAYER];
1222    Window &conformanceWindow = m_cSPS.getConformanceWindow();
1223    Window defaultDisplayWindow = m_cSPS.getVuiParametersPresentFlag() ? m_cSPS.getVuiParameters()->getDefaultDisplayWindow() : Window();
1224
1225    if (m_cIlpPic[0] == NULL)
1226    {
1227      for (Int j=0; j<1/*MAX_NUM_REF*/; j++)
1228      {
1229        m_cIlpPic[j] = new  TComPic;
1230#if SVC_UPSAMPLING
1231        m_cIlpPic[j]->create(m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, conformanceWindow, defaultDisplayWindow, numReorderPics, &m_cSPS, true);
1232#else
1233        m_cIlpPic[j]->create(m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, conformanceWindow, defaultDisplayWindow, numReorderPics, true);
1234#endif
1235        for (Int i=0; i<m_cIlpPic[j]->getPicSym()->getNumberOfCUsInFrame(); i++)
1236        {
1237          m_cIlpPic[j]->getPicSym()->getCU(i)->initCU(m_cIlpPic[j], i);
1238        }
1239      }
1240    }
1241  }
1242}
1243
1244Void TEncTop::setILRPic(TComPic *pcPic)
1245{
1246  if(m_cIlpPic[0])
1247  {
1248    m_cIlpPic[0]->copyUpsampledPictureYuv(pcPic->getFullPelBaseRec(), m_cIlpPic[0]->getPicYuvRec());
1249    m_cIlpPic[0]->getSlice(0)->setPOC(pcPic->getPOC());
1250    m_cIlpPic[0]->setLayerId(pcPic->getSlice(0)->getBaseColPic()->getLayerId()); //set reference layerId
1251    m_cIlpPic[0]->getPicYuvRec()->setBorderExtension(false);
1252    m_cIlpPic[0]->getPicYuvRec()->extendPicBorder();
1253  }
1254}
1255#endif
1256#endif
1257//! \}
Note: See TracBrowser for help on using the repository browser.