source: 3DVCSoftware/branches/HTM-DEV-0.3-dev2/source/Lib/TLibEncoder/TEncTop.cpp @ 534

Last change on this file since 534 was 534, checked in by tech, 11 years ago

MergeMerged tags/HTM-DEV-1.0.

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