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

Last change on this file since 295 was 291, checked in by nokia, 12 years ago

JCTVC-M0457: Co-located picture signaling

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