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

Last change on this file since 289 was 288, checked in by qualcomm, 13 years ago

Changes made to signaling of scaled reference layer offsets.

Patch incorporating changes made to signaling of scaled reference layer offsets during SHVC editing. The number of sets of scaled reference layer offsets is signaled. Changes to configuration files also included.

From: Adarsh K. Ramasubramonian <aramasub@…>

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