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

Last change on this file since 250 was 250, checked in by seregin, 11 years ago

use refLayerIdc for getting reference layer encoder and decoder

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