source: SHVCSoftware/branches/SHM-2.1-dev/source/Lib/TLibEncoder/TEncTop.cpp @ 226

Last change on this file since 226 was 211, checked in by ustc, 12 years ago

JCTVC-M0037. rate control harmonization with SHVC.

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