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

Last change on this file since 170 was 164, checked in by interdigital, 12 years ago

converge setRefPicListSvc() into setRefPicList(),
remove REF_LIST_BUGFIX and always enable it in REF_IDX_FRAMEWORK

File size: 39.3 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  ProfileTierLevel& profileTierLevel = *m_cSPS.getPTL()->getGeneralPTL();
579  profileTierLevel.setLevelIdc(m_level);
580  profileTierLevel.setTierFlag(m_levelTier);
581  profileTierLevel.setProfileIdc(m_profile);
582  profileTierLevel.setProfileCompatibilityFlag(m_profile, 1);
583#if L0046_CONSTRAINT_FLAGS
584  profileTierLevel.setProgressiveSourceFlag(m_progressiveSourceFlag);
585  profileTierLevel.setInterlacedSourceFlag(m_interlacedSourceFlag);
586  profileTierLevel.setNonPackedConstraintFlag(m_nonPackedConstraintFlag);
587  profileTierLevel.setFrameOnlyConstraintFlag(m_frameOnlyConstraintFlag);
588#endif
589 
590  if (m_profile == Profile::MAIN10 && g_bitDepthY == 8 && g_bitDepthC == 8)
591  {
592    /* The above constraint is equal to Profile::MAIN */
593    profileTierLevel.setProfileCompatibilityFlag(Profile::MAIN, 1);
594  }
595  if (m_profile == Profile::MAIN)
596  {
597    /* A Profile::MAIN10 decoder can always decode Profile::MAIN */
598    profileTierLevel.setProfileCompatibilityFlag(Profile::MAIN10, 1);
599  }
600  /* XXX: should Main be marked as compatible with still picture? */
601  /* XXX: may be a good idea to refactor the above into a function
602   * that chooses the actual compatibility based upon options */
603
604  m_cSPS.setPicWidthInLumaSamples         ( m_iSourceWidth      );
605  m_cSPS.setPicHeightInLumaSamples        ( m_iSourceHeight     );
606  m_cSPS.setConformanceWindow             ( m_conformanceWindow );
607  m_cSPS.setMaxCUWidth    ( g_uiMaxCUWidth      );
608  m_cSPS.setMaxCUHeight   ( g_uiMaxCUHeight     );
609  m_cSPS.setMaxCUDepth    ( g_uiMaxCUDepth      );
610
611  Int minCUSize = m_cSPS.getMaxCUWidth() >> ( m_cSPS.getMaxCUDepth()-g_uiAddCUDepth );
612  Int log2MinCUSize = 0;
613  while(minCUSize > 1)
614  {
615    minCUSize >>= 1;
616    log2MinCUSize++;
617  }
618
619  m_cSPS.setLog2MinCodingBlockSize(log2MinCUSize);
620  m_cSPS.setLog2DiffMaxMinCodingBlockSize(m_cSPS.getMaxCUDepth()-g_uiAddCUDepth);
621#if SVC_EXTENSION
622  m_cSPS.setSPSId         ( m_iSPSIdCnt       );
623#endif
624 
625  m_cSPS.setPCMLog2MinSize (m_uiPCMLog2MinSize);
626  m_cSPS.setUsePCM        ( m_usePCM           );
627  m_cSPS.setPCMLog2MaxSize( m_pcmLog2MaxSize  );
628
629  m_cSPS.setQuadtreeTULog2MaxSize( m_uiQuadtreeTULog2MaxSize );
630  m_cSPS.setQuadtreeTULog2MinSize( m_uiQuadtreeTULog2MinSize );
631  m_cSPS.setQuadtreeTUMaxDepthInter( m_uiQuadtreeTUMaxDepthInter    );
632  m_cSPS.setQuadtreeTUMaxDepthIntra( m_uiQuadtreeTUMaxDepthIntra    );
633 
634  m_cSPS.setTMVPFlagsPresent(false);
635  m_cSPS.setUseLossless   ( m_useLossless  );
636
637  m_cSPS.setMaxTrSize   ( 1 << m_uiQuadtreeTULog2MaxSize );
638#if !L0034_COMBINED_LIST_CLEANUP
639  m_cSPS.setUseLComb    ( m_bUseLComb           );
640#endif
641 
642  Int i;
643 
644  for (i = 0; i < g_uiMaxCUDepth-g_uiAddCUDepth; i++ )
645  {
646    m_cSPS.setAMPAcc( i, m_useAMP );
647    //m_cSPS.setAMPAcc( i, 1 );
648  }
649
650  m_cSPS.setUseAMP ( m_useAMP );
651
652  for (i = g_uiMaxCUDepth-g_uiAddCUDepth; i < g_uiMaxCUDepth; i++ )
653  {
654    m_cSPS.setAMPAcc(i, 0);
655  }
656
657  m_cSPS.setBitDepthY( g_bitDepthY );
658  m_cSPS.setBitDepthC( g_bitDepthC );
659
660  m_cSPS.setQpBDOffsetY ( 6*(g_bitDepthY - 8) );
661  m_cSPS.setQpBDOffsetC ( 6*(g_bitDepthC - 8) );
662
663  m_cSPS.setUseSAO( m_bUseSAO );
664
665  m_cSPS.setMaxTLayers( m_maxTempLayer );
666  m_cSPS.setTemporalIdNestingFlag( ( m_maxTempLayer == 1 ) ? true : false );
667  for ( i = 0; i < m_cSPS.getMaxTLayers(); i++ )
668  {
669    m_cSPS.setMaxDecPicBuffering(m_maxDecPicBuffering[i], i);
670    m_cSPS.setNumReorderPics(m_numReorderPics[i], i);
671  }
672  m_cSPS.setPCMBitDepthLuma (g_uiPCMBitDepthLuma);
673  m_cSPS.setPCMBitDepthChroma (g_uiPCMBitDepthChroma);
674  m_cSPS.setPCMFilterDisableFlag  ( m_bPCMFilterDisableFlag );
675
676  m_cSPS.setScalingListFlag ( (m_useScalingListId == 0) ? 0 : 1 );
677
678  m_cSPS.setUseStrongIntraSmoothing( m_useStrongIntraSmoothing );
679
680  m_cSPS.setVuiParametersPresentFlag(getVuiParametersPresentFlag());
681  if (m_cSPS.getVuiParametersPresentFlag())
682  {
683    TComVUI* pcVUI = m_cSPS.getVuiParameters();
684    pcVUI->setAspectRatioInfoPresentFlag(getAspectRatioIdc() != -1);
685    pcVUI->setAspectRatioIdc(getAspectRatioIdc());
686    pcVUI->setSarWidth(getSarWidth());
687    pcVUI->setSarHeight(getSarHeight());
688    pcVUI->setOverscanInfoPresentFlag(getOverscanInfoPresentFlag());
689    pcVUI->setOverscanAppropriateFlag(getOverscanAppropriateFlag());
690    pcVUI->setVideoSignalTypePresentFlag(getVideoSignalTypePresentFlag());
691    pcVUI->setVideoFormat(getVideoFormat());
692    pcVUI->setVideoFullRangeFlag(getVideoFullRangeFlag());
693    pcVUI->setColourDescriptionPresentFlag(getColourDescriptionPresentFlag());
694    pcVUI->setColourPrimaries(getColourPrimaries());
695    pcVUI->setTransferCharacteristics(getTransferCharacteristics());
696    pcVUI->setMatrixCoefficients(getMatrixCoefficients());
697    pcVUI->setChromaLocInfoPresentFlag(getChromaLocInfoPresentFlag());
698    pcVUI->setChromaSampleLocTypeTopField(getChromaSampleLocTypeTopField());
699    pcVUI->setChromaSampleLocTypeBottomField(getChromaSampleLocTypeBottomField());
700    pcVUI->setNeutralChromaIndicationFlag(getNeutralChromaIndicationFlag());
701    pcVUI->setDefaultDisplayWindow(getDefaultDisplayWindow());
702    pcVUI->setFrameFieldInfoPresentFlag(getFrameFieldInfoPresentFlag());
703    pcVUI->setFieldSeqFlag(false);
704    pcVUI->setHrdParametersPresentFlag(false);
705#if L0043_TIMING_INFO
706    pcVUI->getTimingInfo()->setPocProportionalToTimingFlag(getPocProportionalToTimingFlag());
707    pcVUI->getTimingInfo()->setNumTicksPocDiffOneMinus1   (getNumTicksPocDiffOneMinus1()   );
708#else
709    pcVUI->setPocProportionalToTimingFlag(getPocProportionalToTimingFlag());
710    pcVUI->setNumTicksPocDiffOneMinus1   (getNumTicksPocDiffOneMinus1()   );
711#endif
712    pcVUI->setBitstreamRestrictionFlag(getBitstreamRestrictionFlag());
713    pcVUI->setTilesFixedStructureFlag(getTilesFixedStructureFlag());
714    pcVUI->setMotionVectorsOverPicBoundariesFlag(getMotionVectorsOverPicBoundariesFlag());
715    pcVUI->setMinSpatialSegmentationIdc(getMinSpatialSegmentationIdc());
716    pcVUI->setMaxBytesPerPicDenom(getMaxBytesPerPicDenom());
717    pcVUI->setMaxBitsPerMinCuDenom(getMaxBitsPerMinCuDenom());
718    pcVUI->setLog2MaxMvLengthHorizontal(getLog2MaxMvLengthHorizontal());
719    pcVUI->setLog2MaxMvLengthVertical(getLog2MaxMvLengthVertical());
720  }
721}
722
723Void TEncTop::xInitPPS()
724{
725  m_cPPS.setConstrainedIntraPred( m_bUseConstrainedIntraPred );
726  Bool bUseDQP = (getMaxCuDQPDepth() > 0)? true : false;
727
728  Int lowestQP = - m_cSPS.getQpBDOffsetY();
729
730  if(getUseLossless())
731  {
732    if ((getMaxCuDQPDepth() == 0) && (getMaxDeltaQP() == 0 ) && (getQP() == lowestQP) )
733    {
734      bUseDQP = false;
735    }
736    else
737    {
738      bUseDQP = true;
739    }
740  }
741  else
742  {
743    if(bUseDQP == false)
744    {
745      if((getMaxDeltaQP() != 0 )|| getUseAdaptiveQP())
746      {
747        bUseDQP = true;
748      }
749    }
750  }
751
752  if(bUseDQP)
753  {
754    m_cPPS.setUseDQP(true);
755    m_cPPS.setMaxCuDQPDepth( m_iMaxCuDQPDepth );
756    m_cPPS.setMinCuDQPSize( m_cPPS.getSPS()->getMaxCUWidth() >> ( m_cPPS.getMaxCuDQPDepth()) );
757  }
758  else
759  {
760    m_cPPS.setUseDQP(false);
761    m_cPPS.setMaxCuDQPDepth( 0 );
762    m_cPPS.setMinCuDQPSize( m_cPPS.getSPS()->getMaxCUWidth() >> ( m_cPPS.getMaxCuDQPDepth()) );
763  }
764
765#if RATE_CONTROL_LAMBDA_DOMAIN
766  if ( m_RCEnableRateControl )
767  {
768    m_cPPS.setUseDQP(true);
769    m_cPPS.setMaxCuDQPDepth( 0 );
770    m_cPPS.setMinCuDQPSize( m_cPPS.getSPS()->getMaxCUWidth() >> ( m_cPPS.getMaxCuDQPDepth()) );
771  } 
772#endif
773
774  m_cPPS.setChromaCbQpOffset( m_chromaCbQpOffset );
775  m_cPPS.setChromaCrQpOffset( m_chromaCrQpOffset );
776
777  m_cPPS.setNumSubstreams(m_iWaveFrontSubstreams);
778  m_cPPS.setEntropyCodingSyncEnabledFlag( m_iWaveFrontSynchro > 0 );
779  m_cPPS.setTilesEnabledFlag( (m_iNumColumnsMinus1 > 0 || m_iNumRowsMinus1 > 0) );
780  m_cPPS.setUseWP( m_useWeightedPred );
781  m_cPPS.setWPBiPred( m_useWeightedBiPred );
782  m_cPPS.setOutputFlagPresentFlag( false );
783  m_cPPS.setSignHideFlag(getSignHideFlag());
784#if L0386_DB_METRIC
785  if ( getDeblockingFilterMetric() )
786  {
787    m_cPPS.setDeblockingFilterControlPresentFlag (true);
788    m_cPPS.setDeblockingFilterOverrideEnabledFlag(true);
789    m_cPPS.setPicDisableDeblockingFilterFlag(false);
790    m_cPPS.setDeblockingFilterBetaOffsetDiv2(0);
791    m_cPPS.setDeblockingFilterTcOffsetDiv2(0);
792  } 
793  else
794  {
795  m_cPPS.setDeblockingFilterControlPresentFlag (m_DeblockingFilterControlPresent );
796  }
797#else
798  m_cPPS.setDeblockingFilterControlPresentFlag (m_DeblockingFilterControlPresent );
799#endif
800  m_cPPS.setLog2ParallelMergeLevelMinus2   (m_log2ParallelMergeLevelMinus2 );
801  m_cPPS.setCabacInitPresentFlag(CABAC_INIT_PRESENT_FLAG);
802  m_cPPS.setLoopFilterAcrossSlicesEnabledFlag( m_bLFCrossSliceBoundaryFlag );
803  Int histogram[MAX_NUM_REF + 1];
804  for( Int i = 0; i <= MAX_NUM_REF; i++ )
805  {
806    histogram[i]=0;
807  }
808  for( Int i = 0; i < getGOPSize(); i++ )
809  {
810    assert(getGOPEntry(i).m_numRefPicsActive >= 0 && getGOPEntry(i).m_numRefPicsActive <= MAX_NUM_REF);
811    histogram[getGOPEntry(i).m_numRefPicsActive]++;
812  }
813  Int maxHist=-1;
814  Int bestPos=0;
815  for( Int i = 0; i <= MAX_NUM_REF; i++ )
816  {
817    if(histogram[i]>maxHist)
818    {
819      maxHist=histogram[i];
820      bestPos=i;
821    }
822  }
823#if L0323_LIMIT_DEFAULT_LIST_SIZE
824  assert(bestPos <= 15);
825#endif
826  m_cPPS.setNumRefIdxL0DefaultActive(bestPos);
827  m_cPPS.setNumRefIdxL1DefaultActive(bestPos);
828  m_cPPS.setTransquantBypassEnableFlag(getTransquantBypassEnableFlag());
829  m_cPPS.setUseTransformSkip( m_useTransformSkip );
830  if (m_sliceSegmentMode)
831  {
832    m_cPPS.setDependentSliceSegmentsEnabledFlag( true );
833  }
834  if( m_cPPS.getDependentSliceSegmentsEnabledFlag() )
835  {
836    Int NumCtx = m_cPPS.getEntropyCodingSyncEnabledFlag()?2:1;
837    m_cSliceEncoder.initCtxMem( NumCtx );
838    for ( UInt st = 0; st < NumCtx; st++ )
839    {
840      TEncSbac* ctx = NULL;
841      ctx = new TEncSbac;
842      ctx->init( &m_cBinCoderCABAC );
843      m_cSliceEncoder.setCtxMem( ctx, st );
844    }
845  }
846#if REF_IDX_FRAMEWORK
847  if (!m_layerId)
848  {
849    m_cPPS.setListsModificationPresentFlag(false);
850  }
851  else
852  {
853    m_cPPS.setListsModificationPresentFlag(true);
854  }
855#endif
856#if SVC_EXTENSION
857  m_cPPS.setPPSId         ( m_iPPSIdCnt         );
858  m_cPPS.setSPSId         ( m_iSPSIdCnt         );
859#endif
860}
861
862//Function for initializing m_RPSList, a list of TComReferencePictureSet, based on the GOPEntry objects read from the config file.
863Void TEncTop::xInitRPS()
864{
865  TComReferencePictureSet*      rps;
866 
867  m_cSPS.createRPSList(getGOPSize()+m_extraRPSs);
868  TComRPSList* rpsList = m_cSPS.getRPSList();
869
870  for( Int i = 0; i < getGOPSize()+m_extraRPSs; i++) 
871  {
872    GOPEntry ge = getGOPEntry(i);
873    rps = rpsList->getReferencePictureSet(i);
874    rps->setNumberOfPictures(ge.m_numRefPics);
875    rps->setNumRefIdc(ge.m_numRefIdc);
876    Int numNeg = 0;
877    Int numPos = 0;
878    for( Int j = 0; j < ge.m_numRefPics; j++)
879    {
880      rps->setDeltaPOC(j,ge.m_referencePics[j]);
881      rps->setUsed(j,ge.m_usedByCurrPic[j]);
882      if(ge.m_referencePics[j]>0)
883      {
884        numPos++;
885      }
886      else
887      {
888        numNeg++;
889      }
890    }
891    rps->setNumberOfNegativePictures(numNeg);
892    rps->setNumberOfPositivePictures(numPos);
893
894    // handle inter RPS intialization from the config file.
895#if AUTO_INTER_RPS
896    rps->setInterRPSPrediction(ge.m_interRPSPrediction > 0);  // not very clean, converting anything > 0 to true.
897    rps->setDeltaRIdxMinus1(0);                               // index to the Reference RPS is always the previous one.
898    TComReferencePictureSet*     RPSRef = rpsList->getReferencePictureSet(i-1);  // get the reference RPS
899
900    if (ge.m_interRPSPrediction == 2)  // Automatic generation of the inter RPS idc based on the RIdx provided.
901    {
902      Int deltaRPS = getGOPEntry(i-1).m_POC - ge.m_POC;  // the ref POC - current POC
903      Int numRefDeltaPOC = RPSRef->getNumberOfPictures();
904
905      rps->setDeltaRPS(deltaRPS);           // set delta RPS
906      rps->setNumRefIdc(numRefDeltaPOC+1);  // set the numRefIdc to the number of pictures in the reference RPS + 1.
907      Int count=0;
908      for (Int j = 0; j <= numRefDeltaPOC; j++ ) // cycle through pics in reference RPS.
909      {
910        Int RefDeltaPOC = (j<numRefDeltaPOC)? RPSRef->getDeltaPOC(j): 0;  // if it is the last decoded picture, set RefDeltaPOC = 0
911        rps->setRefIdc(j, 0);
912        for (Int k = 0; k < rps->getNumberOfPictures(); k++ )  // cycle through pics in current RPS.
913        {
914          if (rps->getDeltaPOC(k) == ( RefDeltaPOC + deltaRPS))  // if the current RPS has a same picture as the reference RPS.
915          {
916              rps->setRefIdc(j, (rps->getUsed(k)?1:2));
917              count++;
918              break;
919          }
920        }
921      }
922      if (count != rps->getNumberOfPictures())
923      {
924        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");
925        rps->setInterRPSPrediction(0);
926      }
927    }
928    else if (ge.m_interRPSPrediction == 1)  // inter RPS idc based on the RefIdc values provided in config file.
929    {
930      rps->setDeltaRPS(ge.m_deltaRPS);
931      rps->setNumRefIdc(ge.m_numRefIdc);
932      for (Int j = 0; j < ge.m_numRefIdc; j++ )
933      {
934        rps->setRefIdc(j, ge.m_refIdc[j]);
935      }
936#if WRITE_BACK
937      // the folowing code overwrite the deltaPOC and Used by current values read from the config file with the ones
938      // computed from the RefIdc.  A warning is printed if they are not identical.
939      numNeg = 0;
940      numPos = 0;
941      TComReferencePictureSet      RPSTemp;  // temporary variable
942
943      for (Int j = 0; j < ge.m_numRefIdc; j++ )
944      {
945        if (ge.m_refIdc[j])
946        {
947          Int deltaPOC = ge.m_deltaRPS + ((j < RPSRef->getNumberOfPictures())? RPSRef->getDeltaPOC(j) : 0);
948          RPSTemp.setDeltaPOC((numNeg+numPos),deltaPOC);
949          RPSTemp.setUsed((numNeg+numPos),ge.m_refIdc[j]==1?1:0);
950          if (deltaPOC<0)
951          {
952            numNeg++;
953          }
954          else
955          {
956            numPos++;
957          }
958        }
959      }
960      if (numNeg != rps->getNumberOfNegativePictures())
961      {
962        printf("Warning: number of negative pictures in RPS is different between intra and inter RPS specified in the config file.\n");
963        rps->setNumberOfNegativePictures(numNeg);
964        rps->setNumberOfPositivePictures(numNeg+numPos);
965      }
966      if (numPos != rps->getNumberOfPositivePictures())
967      {
968        printf("Warning: number of positive pictures in RPS is different between intra and inter RPS specified in the config file.\n");
969        rps->setNumberOfPositivePictures(numPos);
970        rps->setNumberOfPositivePictures(numNeg+numPos);
971      }
972      RPSTemp.setNumberOfPictures(numNeg+numPos);
973      RPSTemp.setNumberOfNegativePictures(numNeg);
974      RPSTemp.sortDeltaPOC();     // sort the created delta POC before comparing
975      // check if Delta POC and Used are the same
976      // print warning if they are not.
977      for (Int j = 0; j < ge.m_numRefIdc; j++ )
978      {
979        if (RPSTemp.getDeltaPOC(j) != rps->getDeltaPOC(j))
980        {
981          printf("Warning: delta POC is different between intra RPS and inter RPS specified in the config file.\n");
982          rps->setDeltaPOC(j,RPSTemp.getDeltaPOC(j));
983        }
984        if (RPSTemp.getUsed(j) != rps->getUsed(j))
985        {
986          printf("Warning: Used by Current in RPS is different between intra and inter RPS specified in the config file.\n");
987          rps->setUsed(j,RPSTemp.getUsed(j));
988        }
989      }
990#endif
991    }
992#else
993    rps->setInterRPSPrediction(ge.m_interRPSPrediction);
994    if (ge.m_interRPSPrediction)
995    {
996      rps->setDeltaRIdxMinus1(0);
997      rps->setDeltaRPS(ge.m_deltaRPS);
998      rps->setNumRefIdc(ge.m_numRefIdc);
999      for (Int j = 0; j < ge.m_numRefIdc; j++ )
1000      {
1001        rps->setRefIdc(j, ge.m_refIdc[j]);
1002      }
1003#if WRITE_BACK
1004      // the folowing code overwrite the deltaPOC and Used by current values read from the config file with the ones
1005      // computed from the RefIdc.  This is not necessary if both are identical. Currently there is no check to see if they are identical.
1006      numNeg = 0;
1007      numPos = 0;
1008      TComReferencePictureSet*     RPSRef = m_RPSList.getReferencePictureSet(i-1);
1009
1010      for (Int j = 0; j < ge.m_numRefIdc; j++ )
1011      {
1012        if (ge.m_refIdc[j])
1013        {
1014          Int deltaPOC = ge.m_deltaRPS + ((j < RPSRef->getNumberOfPictures())? RPSRef->getDeltaPOC(j) : 0);
1015          rps->setDeltaPOC((numNeg+numPos),deltaPOC);
1016          rps->setUsed((numNeg+numPos),ge.m_refIdc[j]==1?1:0);
1017          if (deltaPOC<0)
1018          {
1019            numNeg++;
1020          }
1021          else
1022          {
1023            numPos++;
1024          }
1025        }
1026      }
1027      rps->setNumberOfNegativePictures(numNeg);
1028      rps->setNumberOfPositivePictures(numPos);
1029      rps->sortDeltaPOC();
1030#endif
1031    }
1032#endif //INTER_RPS_AUTO
1033  }
1034 
1035}
1036
1037   // This is a function that
1038   // determines what Reference Picture Set to use
1039   // for a specific slice (with POC = POCCurr)
1040Void TEncTop::selectReferencePictureSet(TComSlice* slice, Int POCCurr, Int GOPid )
1041{
1042  slice->setRPSidx(GOPid);
1043
1044  for(Int extraNum=m_iGOPSize; extraNum<m_extraRPSs+m_iGOPSize; extraNum++)
1045  {   
1046    if(m_uiIntraPeriod > 0 && getDecodingRefreshType() > 0)
1047    {
1048      Int POCIndex = POCCurr%m_uiIntraPeriod;
1049      if(POCIndex == 0)
1050      {
1051        POCIndex = m_uiIntraPeriod;
1052      }
1053      if(POCIndex == m_GOPList[extraNum].m_POC)
1054      {
1055        slice->setRPSidx(extraNum);
1056      }
1057    }
1058    else
1059    {
1060      if(POCCurr==m_GOPList[extraNum].m_POC)
1061      {
1062        slice->setRPSidx(extraNum);
1063      }
1064    }
1065  }
1066
1067  slice->setRPS(getSPS()->getRPSList()->getReferencePictureSet(slice->getRPSidx()));
1068  slice->getRPS()->setNumberOfPictures(slice->getRPS()->getNumberOfNegativePictures()+slice->getRPS()->getNumberOfPositivePictures());
1069
1070}
1071
1072#if L0208_SOP_DESCRIPTION_SEI
1073Int TEncTop::getReferencePictureSetIdxForSOP(TComSlice* slice, Int POCCurr, Int GOPid )
1074{
1075  int rpsIdx = GOPid;
1076
1077  for(Int extraNum=m_iGOPSize; extraNum<m_extraRPSs+m_iGOPSize; extraNum++)
1078  {   
1079    if(m_uiIntraPeriod > 0 && getDecodingRefreshType() > 0)
1080    {
1081      Int POCIndex = POCCurr%m_uiIntraPeriod;
1082      if(POCIndex == 0)
1083      {
1084        POCIndex = m_uiIntraPeriod;
1085      }
1086      if(POCIndex == m_GOPList[extraNum].m_POC)
1087      {
1088        rpsIdx = extraNum;
1089      }
1090    }
1091    else
1092    {
1093      if(POCCurr==m_GOPList[extraNum].m_POC)
1094      {
1095        rpsIdx = extraNum;
1096      }
1097    }
1098  }
1099
1100  return rpsIdx;
1101}
1102#endif
1103
1104Void  TEncTop::xInitPPSforTiles()
1105{
1106  m_cPPS.setUniformSpacingFlag( m_iUniformSpacingIdr );
1107  m_cPPS.setNumColumnsMinus1( m_iNumColumnsMinus1 );
1108  m_cPPS.setNumRowsMinus1( m_iNumRowsMinus1 );
1109  if( m_iUniformSpacingIdr == 0 )
1110  {
1111    m_cPPS.setColumnWidth( m_puiColumnWidth );
1112    m_cPPS.setRowHeight( m_puiRowHeight );
1113  }
1114  m_cPPS.setLoopFilterAcrossTilesEnabledFlag( m_loopFilterAcrossTilesEnabledFlag );
1115
1116  // # substreams is "per tile" when tiles are independent.
1117  if (m_iWaveFrontSynchro
1118    )
1119  {
1120    m_cPPS.setNumSubstreams(m_iWaveFrontSubstreams * (m_iNumColumnsMinus1+1));
1121  }
1122}
1123
1124Void  TEncCfg::xCheckGSParameters()
1125{
1126  Int   iWidthInCU = ( m_iSourceWidth%g_uiMaxCUWidth ) ? m_iSourceWidth/g_uiMaxCUWidth + 1 : m_iSourceWidth/g_uiMaxCUWidth;
1127  Int   iHeightInCU = ( m_iSourceHeight%g_uiMaxCUHeight ) ? m_iSourceHeight/g_uiMaxCUHeight + 1 : m_iSourceHeight/g_uiMaxCUHeight;
1128  UInt  uiCummulativeColumnWidth = 0;
1129  UInt  uiCummulativeRowHeight = 0;
1130
1131  //check the column relative parameters
1132  if( m_iNumColumnsMinus1 >= (1<<(LOG2_MAX_NUM_COLUMNS_MINUS1+1)) )
1133  {
1134    printf( "The number of columns is larger than the maximum allowed number of columns.\n" );
1135    exit( EXIT_FAILURE );
1136  }
1137
1138  if( m_iNumColumnsMinus1 >= iWidthInCU )
1139  {
1140    printf( "The current picture can not have so many columns.\n" );
1141    exit( EXIT_FAILURE );
1142  }
1143
1144  if( m_iNumColumnsMinus1 && m_iUniformSpacingIdr==0 )
1145  {
1146    for(Int i=0; i<m_iNumColumnsMinus1; i++)
1147    {
1148      uiCummulativeColumnWidth += m_puiColumnWidth[i];
1149    }
1150
1151    if( uiCummulativeColumnWidth >= iWidthInCU )
1152    {
1153      printf( "The width of the column is too large.\n" );
1154      exit( EXIT_FAILURE );
1155    }
1156  }
1157
1158  //check the row relative parameters
1159  if( m_iNumRowsMinus1 >= (1<<(LOG2_MAX_NUM_ROWS_MINUS1+1)) )
1160  {
1161    printf( "The number of rows is larger than the maximum allowed number of rows.\n" );
1162    exit( EXIT_FAILURE );
1163  }
1164
1165  if( m_iNumRowsMinus1 >= iHeightInCU )
1166  {
1167    printf( "The current picture can not have so many rows.\n" );
1168    exit( EXIT_FAILURE );
1169  }
1170
1171  if( m_iNumRowsMinus1 && m_iUniformSpacingIdr==0 )
1172  {
1173    for(Int i=0; i<m_iNumRowsMinus1; i++)
1174    {
1175      uiCummulativeRowHeight += m_puiRowHeight[i];
1176    }
1177
1178    if( uiCummulativeRowHeight >= iHeightInCU )
1179    {
1180      printf( "The height of the row is too large.\n" );
1181      exit( EXIT_FAILURE );
1182    }
1183  }
1184}
1185
1186#if SVC_EXTENSION
1187#if VPS_EXTN_DIRECT_REF_LAYERS_CONTINUE
1188TEncTop* TEncTop::getRefLayerEnc( UInt layerId )
1189{
1190  if( m_ppcTEncTop[m_layerId]->getNumDirectRefLayers() <= 0 )
1191  {
1192    return NULL;
1193  }
1194
1195  // currently only one reference layer is supported
1196  assert( m_ppcTEncTop[m_layerId]->getNumDirectRefLayers() == 1 );
1197
1198  return (TEncTop *)getLayerEnc( getVPS()->getRefLayerId( m_layerId, 0 ) );
1199}
1200#endif
1201
1202#if REF_IDX_FRAMEWORK
1203Void TEncTop::xInitILRP()
1204{
1205  if(m_layerId>0)
1206  {
1207    g_bitDepthY     = m_cSPS.getBitDepthY();
1208    g_bitDepthC     = m_cSPS.getBitDepthC();
1209    g_uiMaxCUWidth  = m_cSPS.getMaxCUWidth();
1210    g_uiMaxCUHeight = m_cSPS.getMaxCUHeight();
1211    g_uiMaxCUDepth  = m_cSPS.getMaxCUDepth();
1212    g_uiAddCUDepth  = max (0, m_cSPS.getLog2MinCodingBlockSize() - (Int)m_cSPS.getQuadtreeTULog2MinSize() );
1213
1214    Int  numReorderPics[MAX_TLAYER];
1215    Window &conformanceWindow = m_cSPS.getConformanceWindow();
1216    Window defaultDisplayWindow = m_cSPS.getVuiParametersPresentFlag() ? m_cSPS.getVuiParameters()->getDefaultDisplayWindow() : Window();
1217
1218    if (m_cIlpPic[0] == NULL)
1219    {
1220      for (Int j=0; j<1/*MAX_NUM_REF*/; j++)
1221      {
1222        m_cIlpPic[j] = new  TComPic;
1223#if SVC_UPSAMPLING
1224        m_cIlpPic[j]->create(m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, conformanceWindow, defaultDisplayWindow, numReorderPics, &m_cSPS, true);
1225#else
1226        m_cIlpPic[j]->create(m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, conformanceWindow, defaultDisplayWindow, numReorderPics, true);
1227#endif
1228        for (Int i=0; i<m_cIlpPic[j]->getPicSym()->getNumberOfCUsInFrame(); i++)
1229        {
1230          m_cIlpPic[j]->getPicSym()->getCU(i)->initCU(m_cIlpPic[j], i);
1231        }
1232      }
1233    }
1234  }
1235}
1236
1237Void TEncTop::setILRPic(TComPic *pcPic)
1238{
1239  if(m_cIlpPic[0])
1240  {
1241    m_cIlpPic[0]->copyUpsampledPictureYuv(pcPic->getFullPelBaseRec(), m_cIlpPic[0]->getPicYuvRec());
1242    m_cIlpPic[0]->getSlice(0)->setPOC(pcPic->getPOC());
1243    m_cIlpPic[0]->setLayerId(pcPic->getSlice(0)->getBaseColPic()->getLayerId()); //set reference layerId
1244    m_cIlpPic[0]->getPicYuvRec()->setBorderExtension(false);
1245    m_cIlpPic[0]->getPicYuvRec()->extendPicBorder();
1246  }
1247}
1248#endif
1249#endif
1250//! \}
Note: See TracBrowser for help on using the repository browser.