source: SHVCSoftware/branches/SHM-3.1-dev/source/Lib/TLibEncoder/TEncTop.cpp @ 396

Last change on this file since 396 was 389, checked in by qualcomm, 12 years ago

Signaling representation format in VPS (MACRO: REPN_FORMAT_IN_VPS)

Includes signaling of representation format - including picture resolution, bit depth, chroma format - in the VPS, with the option of updating them in the SPS. The configuration file has "RepFormatIdx%d" added to indicate for each layer which representation format is used. The rep_format() structures are automatically created by the encoder. If the bit depth and the chroma format are also changed across layers, some more configuration support would be needed.

From: Adarsh K. Ramasubramonian <aramasub@…>

  • Property svn:eol-style set to native
File size: 43.4 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 SVC_EXTENSION
86  memset(m_cIlpPic, 0, sizeof(m_cIlpPic));
87#if REF_IDX_MFM
88  m_bMFMEnabledFlag = false;
89#endif
90#if SCALED_REF_LAYER_OFFSETS
91  m_numScaledRefLayerOffsets = 0;
92#endif
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  for(Int i=0; i<MAX_NUM_REF; i++)
292  {
293    if(m_cIlpPic[i])
294    {
295      m_cIlpPic[i]->destroy();
296      delete m_cIlpPic[i];
297      m_cIlpPic[i] = NULL;
298    }
299  }
300#else
301  // destroy ROM
302  destroyROM();
303#endif
304  return;
305}
306
307Void TEncTop::init()
308{
309  // initialize SPS
310  xInitSPS();
311 
312  /* set the VPS profile information */
313  *m_cVPS.getPTL() = *m_cSPS.getPTL();
314  m_cVPS.getTimingInfo()->setTimingInfoPresentFlag       ( false );
315  // initialize PPS
316  m_cPPS.setSPS(&m_cSPS);
317  xInitPPS();
318  xInitRPS();
319
320  xInitPPSforTiles();
321
322  // initialize processing unit classes
323  m_cGOPEncoder.  init( this );
324  m_cSliceEncoder.init( this );
325  m_cCuEncoder.   init( this );
326 
327  // initialize transform & quantization class
328  m_pcCavlcCoder = getCavlcCoder();
329 
330  m_cTrQuant.init( 1 << m_uiQuadtreeTULog2MaxSize,
331                  m_useRDOQ, 
332                  m_useRDOQTS,
333                  true 
334                  ,m_useTransformSkipFast
335#if ADAPTIVE_QP_SELECTION                 
336                  , m_bUseAdaptQpSelect
337#endif
338                  );
339 
340  // initialize encoder search class
341  m_cSearch.init( this, &m_cTrQuant, m_iSearchRange, m_bipredSearchRange, m_iFastSearch, 0, &m_cEntropyCoder, &m_cRdCost, getRDSbacCoder(), getRDGoOnSbacCoder() );
342
343  m_iMaxRefPicNum = 0;
344#if SVC_EXTENSION
345  m_iSPSIdCnt ++;
346  m_iPPSIdCnt ++;
347  xInitILRP();
348#endif
349}
350
351// ====================================================================================================================
352// Public member functions
353// ====================================================================================================================
354
355Void TEncTop::deletePicBuffer()
356{
357  TComList<TComPic*>::iterator iterPic = m_cListPic.begin();
358  Int iSize = Int( m_cListPic.size() );
359 
360  for ( Int i = 0; i < iSize; i++ )
361  {
362    TComPic* pcPic = *(iterPic++);
363   
364    pcPic->destroy();
365    delete pcPic;
366    pcPic = NULL;
367  }
368}
369
370/**
371 - Application has picture buffer list with size of GOP + 1
372 - Picture buffer list acts like as ring buffer
373 - End of the list has the latest picture
374 .
375 \param   flush               cause encoder to encode a partial GOP
376 \param   pcPicYuvOrg         original YUV picture
377 \retval  rcListPicYuvRecOut  list of reconstruction YUV pictures
378 \retval  rcListBitstreamOut  list of output bitstreams
379 \retval  iNumEncoded         number of encoded pictures
380 */
381#if SVC_EXTENSION
382Void TEncTop::encode( TComPicYuv* pcPicYuvOrg, TComList<TComPicYuv*>& rcListPicYuvRecOut, std::list<AccessUnit>& accessUnitsOut, Int iPicIdInGOP )
383{
384  // compress GOP
385#if RATE_CONTROL_LAMBDA_DOMAIN
386#if !RC_SHVC_HARMONIZATION
387  if ( m_RCEnableRateControl )
388  {
389    m_cRateCtrl.initRCGOP( m_iNumPicRcvd );
390  }
391#endif
392#endif
393
394  // compress GOP
395  m_cGOPEncoder.compressGOP(iPicIdInGOP, m_iPOCLast, m_iNumPicRcvd, m_cListPic, rcListPicYuvRecOut, accessUnitsOut);
396
397#if RATE_CONTROL_LAMBDA_DOMAIN
398#if !RC_SHVC_HARMONIZATION
399  if ( m_RCEnableRateControl )
400  {
401    m_cRateCtrl.destroyRCGOP();
402  }
403#endif
404#endif
405 
406  m_uiNumAllPicCoded ++;
407}
408
409Void TEncTop::encodePrep( TComPicYuv* pcPicYuvOrg )
410{
411  if (pcPicYuvOrg) 
412  {
413    // get original YUV
414    TComPic* pcPicCurr = NULL;
415    xGetNewPicBuffer( pcPicCurr );
416    pcPicYuvOrg->copyToPic( pcPicCurr->getPicYuvOrg() );
417
418    // compute image characteristics
419    if ( getUseAdaptiveQP() )
420    {
421      m_cPreanalyzer.xPreanalyze( dynamic_cast<TEncPic*>( pcPicCurr ) );
422    }
423  }
424}
425#else
426Void TEncTop::encode(Bool flush, TComPicYuv* pcPicYuvOrg, TComList<TComPicYuv*>& rcListPicYuvRecOut, std::list<AccessUnit>& accessUnitsOut, Int& iNumEncoded )
427{
428  if (pcPicYuvOrg) {
429    // get original YUV
430    TComPic* pcPicCurr = NULL;
431    xGetNewPicBuffer( pcPicCurr );
432    pcPicYuvOrg->copyToPic( pcPicCurr->getPicYuvOrg() );
433
434    // compute image characteristics
435    if ( getUseAdaptiveQP() )
436    {
437      m_cPreanalyzer.xPreanalyze( dynamic_cast<TEncPic*>( pcPicCurr ) );
438    }
439  }
440 
441  if (!m_iNumPicRcvd || (!flush && m_iPOCLast != 0 && m_iNumPicRcvd != m_iGOPSize && m_iGOPSize))
442  {
443    iNumEncoded = 0;
444    return;
445  }
446 
447#if RATE_CONTROL_LAMBDA_DOMAIN
448  if ( m_RCEnableRateControl )
449  {
450    m_cRateCtrl.initRCGOP( m_iNumPicRcvd );
451  }
452#endif
453
454  // compress GOP
455  m_cGOPEncoder.compressGOP(m_iPOCLast, m_iNumPicRcvd, m_cListPic, rcListPicYuvRecOut, accessUnitsOut);
456
457#if RATE_CONTROL_LAMBDA_DOMAIN
458  if ( m_RCEnableRateControl )
459  {
460    m_cRateCtrl.destroyRCGOP();
461  }
462#endif
463 
464  iNumEncoded         = m_iNumPicRcvd;
465  m_iNumPicRcvd       = 0;
466  m_uiNumAllPicCoded += iNumEncoded;
467}
468#endif
469
470// ====================================================================================================================
471// Protected member functions
472// ====================================================================================================================
473
474/**
475 - Application has picture buffer list with size of GOP + 1
476 - Picture buffer list acts like as ring buffer
477 - End of the list has the latest picture
478 .
479 \retval rpcPic obtained picture buffer
480 */
481Void TEncTop::xGetNewPicBuffer ( TComPic*& rpcPic )
482{
483  TComSlice::sortPicList(m_cListPic);
484 
485  if (m_cListPic.size() >= (UInt)(m_iGOPSize + getMaxDecPicBuffering(MAX_TLAYER-1) + 2) )
486  {
487    TComList<TComPic*>::iterator iterPic  = m_cListPic.begin();
488    Int iSize = Int( m_cListPic.size() );
489    for ( Int i = 0; i < iSize; i++ )
490    {
491      rpcPic = *(iterPic++);
492      if(rpcPic->getSlice(0)->isReferenced() == false)
493      {
494        break;
495      }
496    }
497  }
498  else
499  {
500    if ( getUseAdaptiveQP() )
501    {
502      TEncPic* pcEPic = new TEncPic;
503
504#if SVC_EXTENSION //Temporal solution, should be modified
505      if(m_layerId > 0)
506      {
507        for(UInt i = 0; i < m_cVPS.getNumDirectRefLayers( m_layerId ); i++ )
508        {
509          const Window scalEL = getSPS()->getScaledRefLayerWindow(i);
510          Bool zeroOffsets = ( scalEL.getWindowLeftOffset() == 0 && scalEL.getWindowRightOffset() == 0 && scalEL.getWindowTopOffset() == 0 && scalEL.getWindowBottomOffset() == 0 );
511
512#if VPS_EXTN_DIRECT_REF_LAYERS
513          TEncTop *pcEncTopBase = (TEncTop *)getRefLayerEnc( i );
514#else
515          TEncTop *pcEncTopBase = (TEncTop *)getLayerEnc( m_layerId-1 );
516#endif
517          if(m_iSourceWidth != pcEncTopBase->getSourceWidth() || m_iSourceHeight != pcEncTopBase->getSourceHeight() || !zeroOffsets )
518          {
519            pcEPic->setSpatialEnhLayerFlag( i, true );
520
521            //only for scalable extension
522            assert( m_cVPS.getScalabilityMask(1) == true );
523          }
524        }
525      }
526#endif
527
528#if SVC_UPSAMPLING
529      pcEPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, m_cPPS.getMaxCuDQPDepth()+1 ,
530                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics, &m_cSPS);
531#else
532      pcEPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, m_cPPS.getMaxCuDQPDepth()+1 ,
533                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics);
534#endif
535      rpcPic = pcEPic;
536    }
537    else
538    {
539      rpcPic = new TComPic;
540
541#if SVC_EXTENSION //Temporal solution, should be modified
542      if(m_layerId > 0)
543      {
544        for(UInt i = 0; i < m_cVPS.getNumDirectRefLayers( m_layerId ); i++ )
545        {
546          const Window scalEL = getSPS()->getScaledRefLayerWindow(i);
547          Bool zeroOffsets = ( scalEL.getWindowLeftOffset() == 0 && scalEL.getWindowRightOffset() == 0 && scalEL.getWindowTopOffset() == 0 && scalEL.getWindowBottomOffset() == 0 );
548
549#if VPS_EXTN_DIRECT_REF_LAYERS
550          TEncTop *pcEncTopBase = (TEncTop *)getRefLayerEnc( i );
551#else
552          TEncTop *pcEncTopBase = (TEncTop *)getLayerEnc( m_layerId-1 );
553#endif
554          if(m_iSourceWidth != pcEncTopBase->getSourceWidth() || m_iSourceHeight != pcEncTopBase->getSourceHeight() || !zeroOffsets )
555          {
556            rpcPic->setSpatialEnhLayerFlag( i, true );
557
558            //only for scalable extension
559            assert( m_cVPS.getScalabilityMask(1) == true );
560          }
561        }
562      }
563#endif
564
565#if SVC_UPSAMPLING
566      rpcPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, 
567                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics, &m_cSPS);
568#else
569      rpcPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, 
570                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics);
571#endif
572    }
573
574    if (getUseSAO())
575    {
576      rpcPic->getPicSym()->allocSaoParam(&m_cEncSAO);
577    }
578    m_cListPic.pushBack( rpcPic );
579  }
580  rpcPic->setReconMark (false);
581 
582  m_iPOCLast++;
583  m_iNumPicRcvd++;
584 
585  rpcPic->getSlice(0)->setPOC( m_iPOCLast );
586  // mark it should be extended
587  rpcPic->getPicYuvRec()->setBorderExtension(false);
588}
589
590Void TEncTop::xInitSPS()
591{
592#if SVC_EXTENSION
593  m_cSPS.setLayerId(m_layerId);
594#endif
595#if REF_IDX_MFM
596#if !M0457_COL_PICTURE_SIGNALING
597  m_cSPS.setMFMEnabledFlag(m_bMFMEnabledFlag);
598#endif
599#endif
600#if SCALED_REF_LAYER_OFFSETS
601  m_cSPS.setNumScaledRefLayerOffsets(m_numScaledRefLayerOffsets);
602  for(Int i = 0; i < m_cSPS.getNumScaledRefLayerOffsets(); i++)
603  {
604    m_cSPS.getScaledRefLayerWindow(i) = m_scaledRefLayerWindow[i];
605  }
606#endif
607  ProfileTierLevel& profileTierLevel = *m_cSPS.getPTL()->getGeneralPTL();
608  profileTierLevel.setLevelIdc(m_level);
609  profileTierLevel.setTierFlag(m_levelTier);
610  profileTierLevel.setProfileIdc(m_profile);
611  profileTierLevel.setProfileCompatibilityFlag(m_profile, 1);
612  profileTierLevel.setProgressiveSourceFlag(m_progressiveSourceFlag);
613  profileTierLevel.setInterlacedSourceFlag(m_interlacedSourceFlag);
614  profileTierLevel.setNonPackedConstraintFlag(m_nonPackedConstraintFlag);
615  profileTierLevel.setFrameOnlyConstraintFlag(m_frameOnlyConstraintFlag);
616 
617  if (m_profile == Profile::MAIN10 && g_bitDepthY == 8 && g_bitDepthC == 8)
618  {
619    /* The above constraint is equal to Profile::MAIN */
620    profileTierLevel.setProfileCompatibilityFlag(Profile::MAIN, 1);
621  }
622  if (m_profile == Profile::MAIN)
623  {
624    /* A Profile::MAIN10 decoder can always decode Profile::MAIN */
625    profileTierLevel.setProfileCompatibilityFlag(Profile::MAIN10, 1);
626  }
627  /* XXX: should Main be marked as compatible with still picture? */
628  /* XXX: may be a good idea to refactor the above into a function
629   * that chooses the actual compatibility based upon options */
630
631  m_cSPS.setPicWidthInLumaSamples         ( m_iSourceWidth      );
632  m_cSPS.setPicHeightInLumaSamples        ( m_iSourceHeight     );
633  m_cSPS.setConformanceWindow             ( m_conformanceWindow );
634  m_cSPS.setMaxCUWidth    ( g_uiMaxCUWidth      );
635  m_cSPS.setMaxCUHeight   ( g_uiMaxCUHeight     );
636  m_cSPS.setMaxCUDepth    ( g_uiMaxCUDepth      );
637
638  Int minCUSize = m_cSPS.getMaxCUWidth() >> ( m_cSPS.getMaxCUDepth()-g_uiAddCUDepth );
639  Int log2MinCUSize = 0;
640  while(minCUSize > 1)
641  {
642    minCUSize >>= 1;
643    log2MinCUSize++;
644  }
645
646  m_cSPS.setLog2MinCodingBlockSize(log2MinCUSize);
647  m_cSPS.setLog2DiffMaxMinCodingBlockSize(m_cSPS.getMaxCUDepth()-g_uiAddCUDepth);
648#if SVC_EXTENSION
649  m_cSPS.setSPSId         ( m_iSPSIdCnt       );
650#endif
651 
652  m_cSPS.setPCMLog2MinSize (m_uiPCMLog2MinSize);
653  m_cSPS.setUsePCM        ( m_usePCM           );
654  m_cSPS.setPCMLog2MaxSize( m_pcmLog2MaxSize  );
655
656  m_cSPS.setQuadtreeTULog2MaxSize( m_uiQuadtreeTULog2MaxSize );
657  m_cSPS.setQuadtreeTULog2MinSize( m_uiQuadtreeTULog2MinSize );
658  m_cSPS.setQuadtreeTUMaxDepthInter( m_uiQuadtreeTUMaxDepthInter    );
659  m_cSPS.setQuadtreeTUMaxDepthIntra( m_uiQuadtreeTUMaxDepthIntra    );
660 
661  m_cSPS.setTMVPFlagsPresent(false);
662  m_cSPS.setUseLossless   ( m_useLossless  );
663
664  m_cSPS.setMaxTrSize   ( 1 << m_uiQuadtreeTULog2MaxSize );
665 
666  Int i;
667 
668  for (i = 0; i < g_uiMaxCUDepth-g_uiAddCUDepth; i++ )
669  {
670    m_cSPS.setAMPAcc( i, m_useAMP );
671    //m_cSPS.setAMPAcc( i, 1 );
672  }
673
674  m_cSPS.setUseAMP ( m_useAMP );
675
676  for (i = g_uiMaxCUDepth-g_uiAddCUDepth; i < g_uiMaxCUDepth; i++ )
677  {
678    m_cSPS.setAMPAcc(i, 0);
679  }
680
681#if REPN_FORMAT_IN_VPS
682  m_cSPS.setBitDepthY( m_cVPS.getVpsRepFormat( m_cVPS.getVpsRepFormatIdx( m_layerId ) )->getBitDepthVpsLuma() );
683  m_cSPS.setBitDepthC( m_cVPS.getVpsRepFormat( m_cVPS.getVpsRepFormatIdx( m_layerId ) )->getBitDepthVpsChroma()  );
684
685  m_cSPS.setQpBDOffsetY ( 6*(m_cVPS.getVpsRepFormat( m_cVPS.getVpsRepFormatIdx( m_layerId ) )->getBitDepthVpsLuma()  - 8) );
686  m_cSPS.setQpBDOffsetC ( 6*(m_cVPS.getVpsRepFormat( m_cVPS.getVpsRepFormatIdx( m_layerId ) )->getBitDepthVpsChroma()  - 8) );
687#else
688  m_cSPS.setBitDepthY( g_bitDepthY );
689  m_cSPS.setBitDepthC( g_bitDepthC );
690
691  m_cSPS.setQpBDOffsetY ( 6*(g_bitDepthY - 8) );
692  m_cSPS.setQpBDOffsetC ( 6*(g_bitDepthC - 8) );
693#endif
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    pcVUI->getTimingInfo()->setPocProportionalToTimingFlag(getPocProportionalToTimingFlag());
738    pcVUI->getTimingInfo()->setNumTicksPocDiffOneMinus1   (getNumTicksPocDiffOneMinus1()   );
739    pcVUI->setBitstreamRestrictionFlag(getBitstreamRestrictionFlag());
740    pcVUI->setTilesFixedStructureFlag(getTilesFixedStructureFlag());
741    pcVUI->setMotionVectorsOverPicBoundariesFlag(getMotionVectorsOverPicBoundariesFlag());
742    pcVUI->setMinSpatialSegmentationIdc(getMinSpatialSegmentationIdc());
743    pcVUI->setMaxBytesPerPicDenom(getMaxBytesPerPicDenom());
744    pcVUI->setMaxBitsPerMinCuDenom(getMaxBitsPerMinCuDenom());
745    pcVUI->setLog2MaxMvLengthHorizontal(getLog2MaxMvLengthHorizontal());
746    pcVUI->setLog2MaxMvLengthVertical(getLog2MaxMvLengthVertical());
747  }
748}
749
750Void TEncTop::xInitPPS()
751{
752  m_cPPS.setConstrainedIntraPred( m_bUseConstrainedIntraPred );
753  Bool bUseDQP = (getMaxCuDQPDepth() > 0)? true : false;
754
755#if REPN_FORMAT_IN_VPS
756  Int lowestQP;
757  if( m_layerId == 0 || m_cSPS.getUpdateRepFormatFlag() )
758  {
759    lowestQP = - m_cSPS.getQpBDOffsetY();
760  }
761  else
762  {
763    lowestQP = - (m_cVPS.getVpsRepFormat( m_cVPS.getVpsRepFormatIdx( m_layerId ) )->getBitDepthVpsLuma() - 8) * 6;
764  }
765#else
766  Int lowestQP = - m_cSPS.getQpBDOffsetY();
767#endif
768
769  if(getUseLossless())
770  {
771    if ((getMaxCuDQPDepth() == 0) && (getMaxDeltaQP() == 0 ) && (getQP() == lowestQP) )
772    {
773      bUseDQP = false;
774    }
775    else
776    {
777      bUseDQP = true;
778    }
779  }
780  else
781  {
782    if(bUseDQP == false)
783    {
784      if((getMaxDeltaQP() != 0 )|| getUseAdaptiveQP())
785      {
786        bUseDQP = true;
787      }
788    }
789  }
790
791  if(bUseDQP)
792  {
793    m_cPPS.setUseDQP(true);
794    m_cPPS.setMaxCuDQPDepth( m_iMaxCuDQPDepth );
795    m_cPPS.setMinCuDQPSize( m_cPPS.getSPS()->getMaxCUWidth() >> ( m_cPPS.getMaxCuDQPDepth()) );
796  }
797  else
798  {
799    m_cPPS.setUseDQP(false);
800    m_cPPS.setMaxCuDQPDepth( 0 );
801    m_cPPS.setMinCuDQPSize( m_cPPS.getSPS()->getMaxCUWidth() >> ( m_cPPS.getMaxCuDQPDepth()) );
802  }
803
804#if RATE_CONTROL_LAMBDA_DOMAIN
805  if ( m_RCEnableRateControl )
806  {
807    m_cPPS.setUseDQP(true);
808    m_cPPS.setMaxCuDQPDepth( 0 );
809    m_cPPS.setMinCuDQPSize( m_cPPS.getSPS()->getMaxCUWidth() >> ( m_cPPS.getMaxCuDQPDepth()) );
810  } 
811#endif
812
813  m_cPPS.setChromaCbQpOffset( m_chromaCbQpOffset );
814  m_cPPS.setChromaCrQpOffset( m_chromaCrQpOffset );
815
816  m_cPPS.setNumSubstreams(m_iWaveFrontSubstreams);
817  m_cPPS.setEntropyCodingSyncEnabledFlag( m_iWaveFrontSynchro > 0 );
818  m_cPPS.setTilesEnabledFlag( (m_iNumColumnsMinus1 > 0 || m_iNumRowsMinus1 > 0) );
819  m_cPPS.setUseWP( m_useWeightedPred );
820  m_cPPS.setWPBiPred( m_useWeightedBiPred );
821  m_cPPS.setOutputFlagPresentFlag( false );
822  m_cPPS.setSignHideFlag(getSignHideFlag());
823  if ( getDeblockingFilterMetric() )
824  {
825    m_cPPS.setDeblockingFilterControlPresentFlag (true);
826    m_cPPS.setDeblockingFilterOverrideEnabledFlag(true);
827    m_cPPS.setPicDisableDeblockingFilterFlag(false);
828    m_cPPS.setDeblockingFilterBetaOffsetDiv2(0);
829    m_cPPS.setDeblockingFilterTcOffsetDiv2(0);
830  } 
831  else
832  {
833  m_cPPS.setDeblockingFilterControlPresentFlag (m_DeblockingFilterControlPresent );
834  }
835  m_cPPS.setLog2ParallelMergeLevelMinus2   (m_log2ParallelMergeLevelMinus2 );
836  m_cPPS.setCabacInitPresentFlag(CABAC_INIT_PRESENT_FLAG);
837  m_cPPS.setLoopFilterAcrossSlicesEnabledFlag( m_bLFCrossSliceBoundaryFlag );
838  Int histogram[MAX_NUM_REF + 1];
839  for( Int i = 0; i <= MAX_NUM_REF; i++ )
840  {
841    histogram[i]=0;
842  }
843  for( Int i = 0; i < getGOPSize(); i++ )
844  {
845    assert(getGOPEntry(i).m_numRefPicsActive >= 0 && getGOPEntry(i).m_numRefPicsActive <= MAX_NUM_REF);
846    histogram[getGOPEntry(i).m_numRefPicsActive]++;
847  }
848  Int maxHist=-1;
849  Int bestPos=0;
850  for( Int i = 0; i <= MAX_NUM_REF; i++ )
851  {
852    if(histogram[i]>maxHist)
853    {
854      maxHist=histogram[i];
855      bestPos=i;
856    }
857  }
858  assert(bestPos <= 15);
859  m_cPPS.setNumRefIdxL0DefaultActive(bestPos);
860  m_cPPS.setNumRefIdxL1DefaultActive(bestPos);
861  m_cPPS.setTransquantBypassEnableFlag(getTransquantBypassEnableFlag());
862  m_cPPS.setUseTransformSkip( m_useTransformSkip );
863  if (m_sliceSegmentMode)
864  {
865    m_cPPS.setDependentSliceSegmentsEnabledFlag( true );
866  }
867  if( m_cPPS.getDependentSliceSegmentsEnabledFlag() )
868  {
869    Int NumCtx = m_cPPS.getEntropyCodingSyncEnabledFlag()?2:1;
870    m_cSliceEncoder.initCtxMem( NumCtx );
871    for ( UInt st = 0; st < NumCtx; st++ )
872    {
873      TEncSbac* ctx = NULL;
874      ctx = new TEncSbac;
875      ctx->init( &m_cBinCoderCABAC );
876      m_cSliceEncoder.setCtxMem( ctx, st );
877    }
878  }
879#if SVC_EXTENSION
880  if (!m_layerId)
881  {
882    m_cPPS.setListsModificationPresentFlag(false);
883  }
884  else
885  {
886    m_cPPS.setListsModificationPresentFlag(true);
887  }
888
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#if FINAL_RPL_CHANGE_N0082
905    GOPEntry ge = m_ppcTEncTop[m_cSPS.getLayerId()]->getGOPEntry(i);
906#else
907    GOPEntry ge = getGOPEntry(i);
908#endif
909    rps = rpsList->getReferencePictureSet(i);
910    rps->setNumberOfPictures(ge.m_numRefPics);
911    rps->setNumRefIdc(ge.m_numRefIdc);
912    Int numNeg = 0;
913    Int numPos = 0;
914    for( Int j = 0; j < ge.m_numRefPics; j++)
915    {
916      rps->setDeltaPOC(j,ge.m_referencePics[j]);
917      rps->setUsed(j,ge.m_usedByCurrPic[j]);
918      if(ge.m_referencePics[j]>0)
919      {
920        numPos++;
921      }
922      else
923      {
924        numNeg++;
925      }
926    }
927    rps->setNumberOfNegativePictures(numNeg);
928    rps->setNumberOfPositivePictures(numPos);
929
930    // handle inter RPS intialization from the config file.
931#if AUTO_INTER_RPS
932    rps->setInterRPSPrediction(ge.m_interRPSPrediction > 0);  // not very clean, converting anything > 0 to true.
933    rps->setDeltaRIdxMinus1(0);                               // index to the Reference RPS is always the previous one.
934    TComReferencePictureSet*     RPSRef = rpsList->getReferencePictureSet(i-1);  // get the reference RPS
935
936    if (ge.m_interRPSPrediction == 2)  // Automatic generation of the inter RPS idc based on the RIdx provided.
937    {
938      Int deltaRPS = getGOPEntry(i-1).m_POC - ge.m_POC;  // the ref POC - current POC
939      Int numRefDeltaPOC = RPSRef->getNumberOfPictures();
940
941      rps->setDeltaRPS(deltaRPS);           // set delta RPS
942      rps->setNumRefIdc(numRefDeltaPOC+1);  // set the numRefIdc to the number of pictures in the reference RPS + 1.
943      Int count=0;
944      for (Int j = 0; j <= numRefDeltaPOC; j++ ) // cycle through pics in reference RPS.
945      {
946        Int RefDeltaPOC = (j<numRefDeltaPOC)? RPSRef->getDeltaPOC(j): 0;  // if it is the last decoded picture, set RefDeltaPOC = 0
947        rps->setRefIdc(j, 0);
948        for (Int k = 0; k < rps->getNumberOfPictures(); k++ )  // cycle through pics in current RPS.
949        {
950          if (rps->getDeltaPOC(k) == ( RefDeltaPOC + deltaRPS))  // if the current RPS has a same picture as the reference RPS.
951          {
952              rps->setRefIdc(j, (rps->getUsed(k)?1:2));
953              count++;
954              break;
955          }
956        }
957      }
958      if (count != rps->getNumberOfPictures())
959      {
960        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");
961        rps->setInterRPSPrediction(0);
962      }
963    }
964    else if (ge.m_interRPSPrediction == 1)  // inter RPS idc based on the RefIdc values provided in config file.
965    {
966      rps->setDeltaRPS(ge.m_deltaRPS);
967      rps->setNumRefIdc(ge.m_numRefIdc);
968      for (Int j = 0; j < ge.m_numRefIdc; j++ )
969      {
970        rps->setRefIdc(j, ge.m_refIdc[j]);
971      }
972#if WRITE_BACK
973      // the folowing code overwrite the deltaPOC and Used by current values read from the config file with the ones
974      // computed from the RefIdc.  A warning is printed if they are not identical.
975      numNeg = 0;
976      numPos = 0;
977      TComReferencePictureSet      RPSTemp;  // temporary variable
978
979      for (Int j = 0; j < ge.m_numRefIdc; j++ )
980      {
981        if (ge.m_refIdc[j])
982        {
983          Int deltaPOC = ge.m_deltaRPS + ((j < RPSRef->getNumberOfPictures())? RPSRef->getDeltaPOC(j) : 0);
984          RPSTemp.setDeltaPOC((numNeg+numPos),deltaPOC);
985          RPSTemp.setUsed((numNeg+numPos),ge.m_refIdc[j]==1?1:0);
986          if (deltaPOC<0)
987          {
988            numNeg++;
989          }
990          else
991          {
992            numPos++;
993          }
994        }
995      }
996      if (numNeg != rps->getNumberOfNegativePictures())
997      {
998        printf("Warning: number of negative pictures in RPS is different between intra and inter RPS specified in the config file.\n");
999        rps->setNumberOfNegativePictures(numNeg);
1000        rps->setNumberOfPositivePictures(numNeg+numPos);
1001      }
1002      if (numPos != rps->getNumberOfPositivePictures())
1003      {
1004        printf("Warning: number of positive pictures in RPS is different between intra and inter RPS specified in the config file.\n");
1005        rps->setNumberOfPositivePictures(numPos);
1006        rps->setNumberOfPositivePictures(numNeg+numPos);
1007      }
1008      RPSTemp.setNumberOfPictures(numNeg+numPos);
1009      RPSTemp.setNumberOfNegativePictures(numNeg);
1010      RPSTemp.sortDeltaPOC();     // sort the created delta POC before comparing
1011      // check if Delta POC and Used are the same
1012      // print warning if they are not.
1013      for (Int j = 0; j < ge.m_numRefIdc; j++ )
1014      {
1015        if (RPSTemp.getDeltaPOC(j) != rps->getDeltaPOC(j))
1016        {
1017          printf("Warning: delta POC is different between intra RPS and inter RPS specified in the config file.\n");
1018          rps->setDeltaPOC(j,RPSTemp.getDeltaPOC(j));
1019        }
1020        if (RPSTemp.getUsed(j) != rps->getUsed(j))
1021        {
1022          printf("Warning: Used by Current in RPS is different between intra and inter RPS specified in the config file.\n");
1023          rps->setUsed(j,RPSTemp.getUsed(j));
1024        }
1025      }
1026#endif
1027    }
1028#else
1029    rps->setInterRPSPrediction(ge.m_interRPSPrediction);
1030    if (ge.m_interRPSPrediction)
1031    {
1032      rps->setDeltaRIdxMinus1(0);
1033      rps->setDeltaRPS(ge.m_deltaRPS);
1034      rps->setNumRefIdc(ge.m_numRefIdc);
1035      for (Int j = 0; j < ge.m_numRefIdc; j++ )
1036      {
1037        rps->setRefIdc(j, ge.m_refIdc[j]);
1038      }
1039#if WRITE_BACK
1040      // the folowing code overwrite the deltaPOC and Used by current values read from the config file with the ones
1041      // computed from the RefIdc.  This is not necessary if both are identical. Currently there is no check to see if they are identical.
1042      numNeg = 0;
1043      numPos = 0;
1044      TComReferencePictureSet*     RPSRef = m_RPSList.getReferencePictureSet(i-1);
1045
1046      for (Int j = 0; j < ge.m_numRefIdc; j++ )
1047      {
1048        if (ge.m_refIdc[j])
1049        {
1050          Int deltaPOC = ge.m_deltaRPS + ((j < RPSRef->getNumberOfPictures())? RPSRef->getDeltaPOC(j) : 0);
1051          rps->setDeltaPOC((numNeg+numPos),deltaPOC);
1052          rps->setUsed((numNeg+numPos),ge.m_refIdc[j]==1?1:0);
1053          if (deltaPOC<0)
1054          {
1055            numNeg++;
1056          }
1057          else
1058          {
1059            numPos++;
1060          }
1061        }
1062      }
1063      rps->setNumberOfNegativePictures(numNeg);
1064      rps->setNumberOfPositivePictures(numPos);
1065      rps->sortDeltaPOC();
1066#endif
1067    }
1068#endif //INTER_RPS_AUTO
1069  }
1070 
1071}
1072
1073   // This is a function that
1074   // determines what Reference Picture Set to use
1075   // for a specific slice (with POC = POCCurr)
1076Void TEncTop::selectReferencePictureSet(TComSlice* slice, Int POCCurr, Int GOPid )
1077{
1078  slice->setRPSidx(GOPid);
1079
1080  for(Int extraNum=m_iGOPSize; extraNum<m_extraRPSs+m_iGOPSize; extraNum++)
1081  {   
1082    if(m_uiIntraPeriod > 0 && getDecodingRefreshType() > 0)
1083    {
1084      Int POCIndex = POCCurr%m_uiIntraPeriod;
1085      if(POCIndex == 0)
1086      {
1087        POCIndex = m_uiIntraPeriod;
1088      }
1089      if(POCIndex == m_GOPList[extraNum].m_POC)
1090      {
1091        slice->setRPSidx(extraNum);
1092      }
1093    }
1094    else
1095    {
1096      if(POCCurr==m_GOPList[extraNum].m_POC)
1097      {
1098        slice->setRPSidx(extraNum);
1099      }
1100    }
1101  }
1102
1103  slice->setRPS(getSPS()->getRPSList()->getReferencePictureSet(slice->getRPSidx()));
1104  slice->getRPS()->setNumberOfPictures(slice->getRPS()->getNumberOfNegativePictures()+slice->getRPS()->getNumberOfPositivePictures());
1105
1106}
1107
1108Int TEncTop::getReferencePictureSetIdxForSOP(TComSlice* slice, Int POCCurr, Int GOPid )
1109{
1110  int rpsIdx = GOPid;
1111
1112  for(Int extraNum=m_iGOPSize; extraNum<m_extraRPSs+m_iGOPSize; extraNum++)
1113  {   
1114    if(m_uiIntraPeriod > 0 && getDecodingRefreshType() > 0)
1115    {
1116      Int POCIndex = POCCurr%m_uiIntraPeriod;
1117      if(POCIndex == 0)
1118      {
1119        POCIndex = m_uiIntraPeriod;
1120      }
1121      if(POCIndex == m_GOPList[extraNum].m_POC)
1122      {
1123        rpsIdx = extraNum;
1124      }
1125    }
1126    else
1127    {
1128      if(POCCurr==m_GOPList[extraNum].m_POC)
1129      {
1130        rpsIdx = extraNum;
1131      }
1132    }
1133  }
1134
1135  return rpsIdx;
1136}
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    return (TEncTop *)getLayerEnc( 0 );
1227  }
1228
1229  return (TEncTop *)getLayerEnc( m_cVPS.getRefLayerId( m_layerId, refLayerIdc ) );
1230}
1231#endif
1232
1233#if SVC_EXTENSION
1234#if !REPN_FORMAT_IN_VPS
1235Void TEncTop::xInitILRP()
1236{
1237  if(m_layerId>0)
1238  {
1239    g_bitDepthY     = m_cSPS.getBitDepthY();
1240    g_bitDepthC     = m_cSPS.getBitDepthC();
1241    g_uiMaxCUWidth  = m_cSPS.getMaxCUWidth();
1242    g_uiMaxCUHeight = m_cSPS.getMaxCUHeight();
1243    g_uiMaxCUDepth  = m_cSPS.getMaxCUDepth();
1244    g_uiAddCUDepth  = max (0, m_cSPS.getLog2MinCodingBlockSize() - (Int)m_cSPS.getQuadtreeTULog2MinSize() );
1245
1246    Int  numReorderPics[MAX_TLAYER];
1247    Window &conformanceWindow = m_cSPS.getConformanceWindow();
1248    Window defaultDisplayWindow = m_cSPS.getVuiParametersPresentFlag() ? m_cSPS.getVuiParameters()->getDefaultDisplayWindow() : Window();
1249
1250    if (m_cIlpPic[0] == NULL)
1251    {
1252      for (Int j=0; j < MAX_LAYERS /*MAX_NUM_REF*/; j++) // consider to set to NumDirectRefLayers[LayerIdInVps[nuh_layer_id]]
1253      {
1254        m_cIlpPic[j] = new  TComPic;
1255#if SVC_UPSAMPLING
1256        m_cIlpPic[j]->create(m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, conformanceWindow, defaultDisplayWindow, numReorderPics, &m_cSPS, true);
1257#else
1258        m_cIlpPic[j]->create(m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, conformanceWindow, defaultDisplayWindow, numReorderPics, true);
1259#endif
1260        for (Int i=0; i<m_cIlpPic[j]->getPicSym()->getNumberOfCUsInFrame(); i++)
1261        {
1262          m_cIlpPic[j]->getPicSym()->getCU(i)->initCU(m_cIlpPic[j], i);
1263        }
1264      }
1265    }
1266  }
1267}
1268#else
1269Void TEncTop::xInitILRP()
1270{
1271  RepFormat *repFormat = m_cVPS.getVpsRepFormat( m_cVPS.getVpsRepFormatIdx( m_layerId ) );
1272  Int bitDepthY,bitDepthC,picWidth,picHeight;
1273
1274  if( m_cSPS.getUpdateRepFormatFlag() )
1275  {
1276    bitDepthY   = m_cSPS.getBitDepthY();
1277    bitDepthC   = m_cSPS.getBitDepthC();
1278    picWidth    = m_cSPS.getPicWidthInLumaSamples();
1279    picHeight   = m_cSPS.getPicHeightInLumaSamples();
1280  }
1281  else
1282  {
1283    bitDepthY   = repFormat->getBitDepthVpsLuma();
1284    bitDepthC   = repFormat->getBitDepthVpsChroma();
1285    picWidth    = repFormat->getPicWidthVpsInLumaSamples();
1286    picHeight   = repFormat->getPicHeightVpsInLumaSamples();
1287  }
1288 
1289  if(m_layerId > 0)
1290  {
1291    g_bitDepthY     = bitDepthY;
1292    g_bitDepthC     = bitDepthC;
1293    g_uiMaxCUWidth  = m_cSPS.getMaxCUWidth();
1294    g_uiMaxCUHeight = m_cSPS.getMaxCUHeight();
1295    g_uiMaxCUDepth  = m_cSPS.getMaxCUDepth();
1296    g_uiAddCUDepth  = max (0, m_cSPS.getLog2MinCodingBlockSize() - (Int)m_cSPS.getQuadtreeTULog2MinSize() );
1297
1298    Int  numReorderPics[MAX_TLAYER];
1299    Window &conformanceWindow = m_cSPS.getConformanceWindow();
1300    Window defaultDisplayWindow = m_cSPS.getVuiParametersPresentFlag() ? m_cSPS.getVuiParameters()->getDefaultDisplayWindow() : Window();
1301
1302    if (m_cIlpPic[0] == NULL)
1303    {
1304      for (Int j=0; j < MAX_LAYERS /*MAX_NUM_REF*/; j++) // consider to set to NumDirectRefLayers[LayerIdInVps[nuh_layer_id]]
1305      {
1306        m_cIlpPic[j] = new  TComPic;
1307#if SVC_UPSAMPLING
1308        m_cIlpPic[j]->create(picWidth, picHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, conformanceWindow, defaultDisplayWindow, numReorderPics, &m_cSPS, true);
1309#else
1310        m_cIlpPic[j]->create(m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, conformanceWindow, defaultDisplayWindow, numReorderPics, true);
1311#endif
1312        for (Int i=0; i<m_cIlpPic[j]->getPicSym()->getNumberOfCUsInFrame(); i++)
1313        {
1314          m_cIlpPic[j]->getPicSym()->getCU(i)->initCU(m_cIlpPic[j], i);
1315        }
1316      }
1317    }
1318  }
1319}
1320#endif
1321Void TEncTop::setILRPic(TComPic *pcPic)
1322{
1323  for( Int i = 0; i < pcPic->getSlice(0)->getActiveNumILRRefIdx(); i++ )
1324  {
1325    Int refLayerIdc = pcPic->getSlice(0)->getInterLayerPredLayerIdc(i);
1326
1327    if(m_cIlpPic[refLayerIdc])
1328    {
1329      m_cIlpPic[refLayerIdc]->copyUpsampledPictureYuv(pcPic->getFullPelBaseRec(refLayerIdc), m_cIlpPic[refLayerIdc]->getPicYuvRec());
1330      m_cIlpPic[refLayerIdc]->getSlice(0)->setPOC(pcPic->getPOC());
1331      m_cIlpPic[refLayerIdc]->setLayerId(pcPic->getSlice(0)->getBaseColPic(refLayerIdc)->getLayerId()); //set reference layerId
1332      m_cIlpPic[refLayerIdc]->getPicYuvRec()->setBorderExtension(false);
1333      m_cIlpPic[refLayerIdc]->getPicYuvRec()->extendPicBorder();
1334      for (Int j=0; j<m_cIlpPic[refLayerIdc]->getPicSym()->getNumberOfCUsInFrame(); j++)    // set reference CU layerId
1335      {
1336        m_cIlpPic[refLayerIdc]->getPicSym()->getCU(j)->setLayerId(m_cIlpPic[refLayerIdc]->getLayerId());
1337      }
1338    }
1339  }
1340}
1341#endif
1342#endif
1343//! \}
Note: See TracBrowser for help on using the repository browser.