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

Last change on this file since 539 was 539, checked in by orange, 11 years ago

Integrated QTLPC and added new line mark at the end of TComWedgelet.cpp for MERL

  • Property svn:eol-style set to native
File size: 41.6 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  m_cVPS->getTimingInfo()->setTimingInfoPresentFlag       ( false );
296#else
297  *m_cVPS.getPTL() = *m_cSPS.getPTL();
298  m_cVPS.getTimingInfo()->setTimingInfoPresentFlag       ( false );
299#endif
300  // initialize PPS
301  m_cPPS.setSPS(&m_cSPS);
302  xInitPPS();
303  xInitRPS();
304
305  xInitPPSforTiles();
306
307  // initialize processing unit classes
308  m_cGOPEncoder.  init( this );
309  m_cSliceEncoder.init( this );
310  m_cCuEncoder.   init( this );
311 
312  // initialize transform & quantization class
313  m_pcCavlcCoder = getCavlcCoder();
314 
315  m_cTrQuant.init( 1 << m_uiQuadtreeTULog2MaxSize,
316                  m_useRDOQ, 
317                  m_useRDOQTS,
318                  true 
319                  ,m_useTransformSkipFast
320#if ADAPTIVE_QP_SELECTION                 
321                  , m_bUseAdaptQpSelect
322#endif
323                  );
324 
325  // initialize encoder search class
326  m_cSearch.init( this, &m_cTrQuant, m_iSearchRange, m_bipredSearchRange, m_iFastSearch, 0, &m_cEntropyCoder, &m_cRdCost, getRDSbacCoder(), getRDGoOnSbacCoder() );
327
328  m_iMaxRefPicNum = 0;
329}
330
331// ====================================================================================================================
332// Public member functions
333// ====================================================================================================================
334
335#if H_MV
336Void TEncTop::initNewPic( TComPicYuv* pcPicYuvOrg )
337{
338  TComPic* pcPicCurr = NULL;
339
340  // get original YUV
341  xGetNewPicBuffer( pcPicCurr );
342  pcPicYuvOrg->copyToPic( pcPicCurr->getPicYuvOrg() );
343
344  // compute image characteristics
345  if ( getUseAdaptiveQP() )
346  {
347    m_cPreanalyzer.xPreanalyze( dynamic_cast<TEncPic*>( pcPicCurr ) );
348  }
349#if H_MV
350  pcPicCurr->setLayerId( getLayerId()); 
351#endif
352#if H_3D
353  pcPicCurr->setScaleOffset( m_aaiCodedScale, m_aaiCodedOffset );
354#endif
355}
356#endif
357Void TEncTop::deletePicBuffer()
358{
359  TComList<TComPic*>::iterator iterPic = m_cListPic.begin();
360  Int iSize = Int( m_cListPic.size() );
361 
362  for ( Int i = 0; i < iSize; i++ )
363  {
364    TComPic* pcPic = *(iterPic++);
365   
366    pcPic->destroy();
367    delete pcPic;
368    pcPic = NULL;
369  }
370}
371
372/**
373 - Application has picture buffer list with size of GOP + 1
374 - Picture buffer list acts like as ring buffer
375 - End of the list has the latest picture
376 .
377 \param   flush               cause encoder to encode a partial GOP
378 \param   pcPicYuvOrg         original YUV picture
379 \retval  rcListPicYuvRecOut  list of reconstruction YUV pictures
380 \retval  rcListBitstreamOut  list of output bitstreams
381 \retval  iNumEncoded         number of encoded pictures
382 */
383#if H_MV
384Void TEncTop::encode(Bool flush, TComPicYuv* pcPicYuvOrg, TComList<TComPicYuv*>& rcListPicYuvRecOut, std::list<AccessUnit>& accessUnitsOut, Int& iNumEncoded , Int gopId )
385{
386#else
387Void TEncTop::encode(Bool flush, TComPicYuv* pcPicYuvOrg, TComList<TComPicYuv*>& rcListPicYuvRecOut, std::list<AccessUnit>& accessUnitsOut, Int& iNumEncoded )
388{
389#endif
390#if H_3D
391  TComPic* picLastCoded = getPic( getGOPEncoder()->getPocLastCoded() );
392  if( picLastCoded )
393  {
394    picLastCoded->compressMotion(); 
395  }
396#endif
397#if H_MV
398  if( gopId == 0)
399  {
400    m_cGOPEncoder.initGOP(m_iPOCLast, m_iNumPicRcvd, m_cListPic, rcListPicYuvRecOut, accessUnitsOut); 
401#else
402  if (pcPicYuvOrg) {
403    // get original YUV
404    TComPic* pcPicCurr = NULL;
405    xGetNewPicBuffer( pcPicCurr );
406    pcPicYuvOrg->copyToPic( pcPicCurr->getPicYuvOrg() );
407
408    // compute image characteristics
409    if ( getUseAdaptiveQP() )
410    {
411      m_cPreanalyzer.xPreanalyze( dynamic_cast<TEncPic*>( pcPicCurr ) );
412    }
413  }
414 
415  if (!m_iNumPicRcvd || (!flush && m_iPOCLast != 0 && m_iNumPicRcvd != m_iGOPSize && m_iGOPSize))
416  {
417    iNumEncoded = 0;
418    return;
419  }
420#endif
421 
422#if RATE_CONTROL_LAMBDA_DOMAIN
423  if ( m_RCEnableRateControl )
424  {
425    m_cRateCtrl.initRCGOP( m_iNumPicRcvd );
426  }
427#endif
428
429#if H_MV
430  }
431  m_cGOPEncoder.compressPicInGOP(m_iPOCLast, m_iNumPicRcvd, m_cListPic, rcListPicYuvRecOut, accessUnitsOut, gopId );
432
433  if( gopId + 1 == m_cGOPEncoder.getGOPSize() )
434  {
435#else
436  // compress GOP
437  m_cGOPEncoder.compressGOP(m_iPOCLast, m_iNumPicRcvd, m_cListPic, rcListPicYuvRecOut, accessUnitsOut);
438#endif
439
440#if RATE_CONTROL_LAMBDA_DOMAIN
441  if ( m_RCEnableRateControl )
442  {
443    m_cRateCtrl.destroyRCGOP();
444  }
445#endif
446 
447  iNumEncoded         = m_iNumPicRcvd;
448  m_iNumPicRcvd       = 0;
449  m_uiNumAllPicCoded += iNumEncoded;
450#if H_MV
451}
452#endif
453}
454
455// ====================================================================================================================
456// Protected member functions
457// ====================================================================================================================
458
459/**
460 - Application has picture buffer list with size of GOP + 1
461 - Picture buffer list acts like as ring buffer
462 - End of the list has the latest picture
463 .
464 \retval rpcPic obtained picture buffer
465 */
466Void TEncTop::xGetNewPicBuffer ( TComPic*& rpcPic )
467{
468  TComSlice::sortPicList(m_cListPic);
469 
470  if (m_cListPic.size() >= (UInt)(m_iGOPSize + getMaxDecPicBuffering(MAX_TLAYER-1) + 2) )
471  {
472    TComList<TComPic*>::iterator iterPic  = m_cListPic.begin();
473    Int iSize = Int( m_cListPic.size() );
474    for ( Int i = 0; i < iSize; i++ )
475    {
476      rpcPic = *(iterPic++);
477      if(rpcPic->getSlice(0)->isReferenced() == false)
478      {
479        break;
480      }
481    }
482  }
483  else
484  {
485    if ( getUseAdaptiveQP() )
486    {
487      TEncPic* pcEPic = new TEncPic;
488      pcEPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, m_cPPS.getMaxCuDQPDepth()+1 ,
489                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics);
490      rpcPic = pcEPic;
491    }
492    else
493    {
494      rpcPic = new TComPic;
495
496      rpcPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, 
497                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics);
498    }
499    if (getUseSAO())
500    {
501      rpcPic->getPicSym()->allocSaoParam(&m_cEncSAO);
502    }
503    m_cListPic.pushBack( rpcPic );
504  }
505  rpcPic->setReconMark (false);
506 
507  m_iPOCLast++;
508  m_iNumPicRcvd++;
509 
510  rpcPic->getSlice(0)->setPOC( m_iPOCLast );
511  // mark it should be extended
512  rpcPic->getPicYuvRec()->setBorderExtension(false);
513#if H_3D_VSO_FIX_BORDRE_EXTENSION
514  rpcPic->getPicYuvOrg()->setBorderExtension(false);
515#endif
516}
517
518Void TEncTop::xInitSPS()
519{
520#if H_MV
521  m_cSPS.setSPSId( getLayerIdInVps() );
522  m_cSPS.setLayerId( getLayerId() );
523#endif
524  ProfileTierLevel& profileTierLevel = *m_cSPS.getPTL()->getGeneralPTL();
525  profileTierLevel.setLevelIdc(m_level);
526  profileTierLevel.setTierFlag(m_levelTier);
527  profileTierLevel.setProfileIdc(m_profile);
528  profileTierLevel.setProfileCompatibilityFlag(m_profile, 1);
529  profileTierLevel.setProgressiveSourceFlag(m_progressiveSourceFlag);
530  profileTierLevel.setInterlacedSourceFlag(m_interlacedSourceFlag);
531  profileTierLevel.setNonPackedConstraintFlag(m_nonPackedConstraintFlag);
532  profileTierLevel.setFrameOnlyConstraintFlag(m_frameOnlyConstraintFlag);
533 
534  if (m_profile == Profile::MAIN10 && g_bitDepthY == 8 && g_bitDepthC == 8)
535  {
536    /* The above constraint is equal to Profile::MAIN */
537    profileTierLevel.setProfileCompatibilityFlag(Profile::MAIN, 1);
538  }
539  if (m_profile == Profile::MAIN)
540  {
541    /* A Profile::MAIN10 decoder can always decode Profile::MAIN */
542    profileTierLevel.setProfileCompatibilityFlag(Profile::MAIN10, 1);
543  }
544  /* XXX: should Main be marked as compatible with still picture? */
545  /* XXX: may be a good idea to refactor the above into a function
546   * that chooses the actual compatibility based upon options */
547
548  m_cSPS.setPicWidthInLumaSamples         ( m_iSourceWidth      );
549  m_cSPS.setPicHeightInLumaSamples        ( m_iSourceHeight     );
550  m_cSPS.setConformanceWindow             ( m_conformanceWindow );
551  m_cSPS.setMaxCUWidth    ( g_uiMaxCUWidth      );
552  m_cSPS.setMaxCUHeight   ( g_uiMaxCUHeight     );
553  m_cSPS.setMaxCUDepth    ( g_uiMaxCUDepth      );
554
555  Int minCUSize = m_cSPS.getMaxCUWidth() >> ( m_cSPS.getMaxCUDepth()-g_uiAddCUDepth );
556  Int log2MinCUSize = 0;
557  while(minCUSize > 1)
558  {
559    minCUSize >>= 1;
560    log2MinCUSize++;
561  }
562
563  m_cSPS.setLog2MinCodingBlockSize(log2MinCUSize);
564  m_cSPS.setLog2DiffMaxMinCodingBlockSize(m_cSPS.getMaxCUDepth()-g_uiAddCUDepth);
565 
566  m_cSPS.setPCMLog2MinSize (m_uiPCMLog2MinSize);
567  m_cSPS.setUsePCM        ( m_usePCM           );
568  m_cSPS.setPCMLog2MaxSize( m_pcmLog2MaxSize  );
569
570  m_cSPS.setQuadtreeTULog2MaxSize( m_uiQuadtreeTULog2MaxSize );
571  m_cSPS.setQuadtreeTULog2MinSize( m_uiQuadtreeTULog2MinSize );
572  m_cSPS.setQuadtreeTUMaxDepthInter( m_uiQuadtreeTUMaxDepthInter    );
573  m_cSPS.setQuadtreeTUMaxDepthIntra( m_uiQuadtreeTUMaxDepthIntra    );
574 
575  m_cSPS.setTMVPFlagsPresent(false);
576  m_cSPS.setUseLossless   ( m_useLossless  );
577
578  m_cSPS.setMaxTrSize   ( 1 << m_uiQuadtreeTULog2MaxSize );
579 
580  Int i;
581 
582  for (i = 0; i < g_uiMaxCUDepth-g_uiAddCUDepth; i++ )
583  {
584    m_cSPS.setAMPAcc( i, m_useAMP );
585    //m_cSPS.setAMPAcc( i, 1 );
586  }
587
588  m_cSPS.setUseAMP ( m_useAMP );
589
590#if H_3D_QTLPC
591  m_cSPS.setUseQTL( m_bUseQTL );
592  m_cSPS.setUsePC ( m_bUsePC  );
593#endif
594
595  for (i = g_uiMaxCUDepth-g_uiAddCUDepth; i < g_uiMaxCUDepth; i++ )
596  {
597    m_cSPS.setAMPAcc(i, 0);
598  }
599
600  m_cSPS.setBitDepthY( g_bitDepthY );
601  m_cSPS.setBitDepthC( g_bitDepthC );
602
603  m_cSPS.setQpBDOffsetY ( 6*(g_bitDepthY - 8) );
604  m_cSPS.setQpBDOffsetC ( 6*(g_bitDepthC - 8) );
605
606  m_cSPS.setUseSAO( m_bUseSAO );
607
608  m_cSPS.setMaxTLayers( m_maxTempLayer );
609  m_cSPS.setTemporalIdNestingFlag( ( m_maxTempLayer == 1 ) ? true : false );
610  for ( i = 0; i < m_cSPS.getMaxTLayers(); i++ )
611  {
612    m_cSPS.setMaxDecPicBuffering(m_maxDecPicBuffering[i], i);
613    m_cSPS.setNumReorderPics(m_numReorderPics[i], i);
614  }
615  m_cSPS.setPCMBitDepthLuma (g_uiPCMBitDepthLuma);
616  m_cSPS.setPCMBitDepthChroma (g_uiPCMBitDepthChroma);
617  m_cSPS.setPCMFilterDisableFlag  ( m_bPCMFilterDisableFlag );
618
619  m_cSPS.setScalingListFlag ( (m_useScalingListId == 0) ? 0 : 1 );
620
621  m_cSPS.setUseStrongIntraSmoothing( m_useStrongIntraSmoothing );
622
623  m_cSPS.setVuiParametersPresentFlag(getVuiParametersPresentFlag());
624  if (m_cSPS.getVuiParametersPresentFlag())
625  {
626    TComVUI* pcVUI = m_cSPS.getVuiParameters();
627    pcVUI->setAspectRatioInfoPresentFlag(getAspectRatioIdc() != -1);
628    pcVUI->setAspectRatioIdc(getAspectRatioIdc());
629    pcVUI->setSarWidth(getSarWidth());
630    pcVUI->setSarHeight(getSarHeight());
631    pcVUI->setOverscanInfoPresentFlag(getOverscanInfoPresentFlag());
632    pcVUI->setOverscanAppropriateFlag(getOverscanAppropriateFlag());
633    pcVUI->setVideoSignalTypePresentFlag(getVideoSignalTypePresentFlag());
634    pcVUI->setVideoFormat(getVideoFormat());
635    pcVUI->setVideoFullRangeFlag(getVideoFullRangeFlag());
636    pcVUI->setColourDescriptionPresentFlag(getColourDescriptionPresentFlag());
637    pcVUI->setColourPrimaries(getColourPrimaries());
638    pcVUI->setTransferCharacteristics(getTransferCharacteristics());
639    pcVUI->setMatrixCoefficients(getMatrixCoefficients());
640    pcVUI->setChromaLocInfoPresentFlag(getChromaLocInfoPresentFlag());
641    pcVUI->setChromaSampleLocTypeTopField(getChromaSampleLocTypeTopField());
642    pcVUI->setChromaSampleLocTypeBottomField(getChromaSampleLocTypeBottomField());
643    pcVUI->setNeutralChromaIndicationFlag(getNeutralChromaIndicationFlag());
644    pcVUI->setDefaultDisplayWindow(getDefaultDisplayWindow());
645    pcVUI->setFrameFieldInfoPresentFlag(getFrameFieldInfoPresentFlag());
646    pcVUI->setFieldSeqFlag(false);
647    pcVUI->setHrdParametersPresentFlag(false);
648    pcVUI->getTimingInfo()->setPocProportionalToTimingFlag(getPocProportionalToTimingFlag());
649    pcVUI->getTimingInfo()->setNumTicksPocDiffOneMinus1   (getNumTicksPocDiffOneMinus1()   );
650    pcVUI->setBitstreamRestrictionFlag(getBitstreamRestrictionFlag());
651    pcVUI->setTilesFixedStructureFlag(getTilesFixedStructureFlag());
652    pcVUI->setMotionVectorsOverPicBoundariesFlag(getMotionVectorsOverPicBoundariesFlag());
653    pcVUI->setMinSpatialSegmentationIdc(getMinSpatialSegmentationIdc());
654    pcVUI->setMaxBytesPerPicDenom(getMaxBytesPerPicDenom());
655    pcVUI->setMaxBitsPerMinCuDenom(getMaxBitsPerMinCuDenom());
656    pcVUI->setLog2MaxMvLengthHorizontal(getLog2MaxMvLengthHorizontal());
657    pcVUI->setLog2MaxMvLengthVertical(getLog2MaxMvLengthVertical());
658  }
659#if H_3D
660  if ( !m_isDepth )
661  {
662    m_cSPS.initCamParaSPS           ( m_viewIndex, m_uiCamParPrecision, m_bCamParInSliceHeader, m_aaiCodedScale, m_aaiCodedOffset );
663  }
664#endif
665}
666
667Void TEncTop::xInitPPS()
668{
669#if H_MV
670#if H_MV_FIX_VPS_POINTER
671  if( getVPS()->getNumDirectRefLayers( getLayerIdInVps() ) > 0 )
672#else
673  if( m_cVPS.getNumDirectRefLayers( getLayerIdInVps() ) > 0 )
674#endif
675  {
676    m_cPPS.setListsModificationPresentFlag( true );
677  }
678  m_cPPS.setPPSId( getLayerIdInVps() );
679  m_cPPS.setSPSId( getLayerIdInVps() );
680#endif
681  m_cPPS.setConstrainedIntraPred( m_bUseConstrainedIntraPred );
682  Bool bUseDQP = (getMaxCuDQPDepth() > 0)? true : false;
683
684  Int lowestQP = - m_cSPS.getQpBDOffsetY();
685
686  if(getUseLossless())
687  {
688    if ((getMaxCuDQPDepth() == 0) && (getMaxDeltaQP() == 0 ) && (getQP() == lowestQP) )
689    {
690      bUseDQP = false;
691    }
692    else
693    {
694      bUseDQP = true;
695    }
696  }
697  else
698  {
699    if(bUseDQP == false)
700    {
701      if((getMaxDeltaQP() != 0 )|| getUseAdaptiveQP())
702      {
703        bUseDQP = true;
704      }
705    }
706  }
707
708  if(bUseDQP)
709  {
710    m_cPPS.setUseDQP(true);
711    m_cPPS.setMaxCuDQPDepth( m_iMaxCuDQPDepth );
712    m_cPPS.setMinCuDQPSize( m_cPPS.getSPS()->getMaxCUWidth() >> ( m_cPPS.getMaxCuDQPDepth()) );
713  }
714  else
715  {
716    m_cPPS.setUseDQP(false);
717    m_cPPS.setMaxCuDQPDepth( 0 );
718    m_cPPS.setMinCuDQPSize( m_cPPS.getSPS()->getMaxCUWidth() >> ( m_cPPS.getMaxCuDQPDepth()) );
719  }
720
721#if RATE_CONTROL_LAMBDA_DOMAIN
722  if ( m_RCEnableRateControl )
723  {
724    m_cPPS.setUseDQP(true);
725    m_cPPS.setMaxCuDQPDepth( 0 );
726    m_cPPS.setMinCuDQPSize( m_cPPS.getSPS()->getMaxCUWidth() >> ( m_cPPS.getMaxCuDQPDepth()) );
727  } 
728#endif
729
730  m_cPPS.setChromaCbQpOffset( m_chromaCbQpOffset );
731  m_cPPS.setChromaCrQpOffset( m_chromaCrQpOffset );
732
733  m_cPPS.setNumSubstreams(m_iWaveFrontSubstreams);
734  m_cPPS.setEntropyCodingSyncEnabledFlag( m_iWaveFrontSynchro > 0 );
735  m_cPPS.setTilesEnabledFlag( (m_iNumColumnsMinus1 > 0 || m_iNumRowsMinus1 > 0) );
736  m_cPPS.setUseWP( m_useWeightedPred );
737  m_cPPS.setWPBiPred( m_useWeightedBiPred );
738  m_cPPS.setOutputFlagPresentFlag( false );
739#if H_MV
740  m_cPPS.setNumExtraSliceHeaderBits( 1 ); 
741#endif
742  m_cPPS.setSignHideFlag(getSignHideFlag());
743#if L0386_DB_METRIC
744  if ( getDeblockingFilterMetric() )
745  {
746    m_cPPS.setDeblockingFilterControlPresentFlag (true);
747    m_cPPS.setDeblockingFilterOverrideEnabledFlag(true);
748    m_cPPS.setPicDisableDeblockingFilterFlag(false);
749    m_cPPS.setDeblockingFilterBetaOffsetDiv2(0);
750    m_cPPS.setDeblockingFilterTcOffsetDiv2(0);
751  } 
752  else
753  {
754  m_cPPS.setDeblockingFilterControlPresentFlag (m_DeblockingFilterControlPresent );
755  }
756#else
757  m_cPPS.setDeblockingFilterControlPresentFlag (m_DeblockingFilterControlPresent );
758#endif
759  m_cPPS.setLog2ParallelMergeLevelMinus2   (m_log2ParallelMergeLevelMinus2 );
760  m_cPPS.setCabacInitPresentFlag(CABAC_INIT_PRESENT_FLAG);
761  m_cPPS.setLoopFilterAcrossSlicesEnabledFlag( m_bLFCrossSliceBoundaryFlag );
762  Int histogram[MAX_NUM_REF + 1];
763  for( Int i = 0; i <= MAX_NUM_REF; i++ )
764  {
765    histogram[i]=0;
766  }
767  for( Int i = 0; i < getGOPSize(); i++ )
768  {
769    assert(getGOPEntry(i).m_numRefPicsActive >= 0 && getGOPEntry(i).m_numRefPicsActive <= MAX_NUM_REF);
770    histogram[getGOPEntry(i).m_numRefPicsActive]++;
771  }
772  Int maxHist=-1;
773  Int bestPos=0;
774  for( Int i = 0; i <= MAX_NUM_REF; i++ )
775  {
776    if(histogram[i]>maxHist)
777    {
778      maxHist=histogram[i];
779      bestPos=i;
780    }
781  }
782  assert(bestPos <= 15);
783  m_cPPS.setNumRefIdxL0DefaultActive(bestPos);
784  m_cPPS.setNumRefIdxL1DefaultActive(bestPos);
785  m_cPPS.setTransquantBypassEnableFlag(getTransquantBypassEnableFlag());
786  m_cPPS.setUseTransformSkip( m_useTransformSkip );
787  if (m_sliceSegmentMode)
788  {
789    m_cPPS.setDependentSliceSegmentsEnabledFlag( true );
790  }
791  if( m_cPPS.getDependentSliceSegmentsEnabledFlag() )
792  {
793    Int NumCtx = m_cPPS.getEntropyCodingSyncEnabledFlag()?2:1;
794    m_cSliceEncoder.initCtxMem( NumCtx );
795    for ( UInt st = 0; st < NumCtx; st++ )
796    {
797      TEncSbac* ctx = NULL;
798      ctx = new TEncSbac;
799      ctx->init( &m_cBinCoderCABAC );
800      m_cSliceEncoder.setCtxMem( ctx, st );
801    }
802  }
803#if H_3D
804  if( m_cSPS.hasCamParInSliceHeader() )
805  {
806    m_cPPS.setSliceHeaderExtensionPresentFlag( true ); 
807  }
808#endif
809}
810
811//Function for initializing m_RPSList, a list of TComReferencePictureSet, based on the GOPEntry objects read from the config file.
812Void TEncTop::xInitRPS()
813{
814  TComReferencePictureSet*      rps;
815 
816  m_cSPS.createRPSList(getGOPSize()+m_extraRPSs);
817  TComRPSList* rpsList = m_cSPS.getRPSList();
818
819  for( Int i = 0; i < getGOPSize()+m_extraRPSs; i++) 
820  {
821    GOPEntry ge = getGOPEntry(i);
822    rps = rpsList->getReferencePictureSet(i);
823    rps->setNumberOfPictures(ge.m_numRefPics);
824    rps->setNumRefIdc(ge.m_numRefIdc);
825    Int numNeg = 0;
826    Int numPos = 0;
827    for( Int j = 0; j < ge.m_numRefPics; j++)
828    {
829      rps->setDeltaPOC(j,ge.m_referencePics[j]);
830      rps->setUsed(j,ge.m_usedByCurrPic[j]);
831      if(ge.m_referencePics[j]>0)
832      {
833        numPos++;
834      }
835      else
836      {
837        numNeg++;
838      }
839    }
840    rps->setNumberOfNegativePictures(numNeg);
841    rps->setNumberOfPositivePictures(numPos);
842
843    // handle inter RPS intialization from the config file.
844#if AUTO_INTER_RPS
845    rps->setInterRPSPrediction(ge.m_interRPSPrediction > 0);  // not very clean, converting anything > 0 to true.
846    rps->setDeltaRIdxMinus1(0);                               // index to the Reference RPS is always the previous one.
847    TComReferencePictureSet*     RPSRef = rpsList->getReferencePictureSet(i-1);  // get the reference RPS
848
849    if (ge.m_interRPSPrediction == 2)  // Automatic generation of the inter RPS idc based on the RIdx provided.
850    {
851      Int deltaRPS = getGOPEntry(i-1).m_POC - ge.m_POC;  // the ref POC - current POC
852      Int numRefDeltaPOC = RPSRef->getNumberOfPictures();
853
854      rps->setDeltaRPS(deltaRPS);           // set delta RPS
855      rps->setNumRefIdc(numRefDeltaPOC+1);  // set the numRefIdc to the number of pictures in the reference RPS + 1.
856      Int count=0;
857      for (Int j = 0; j <= numRefDeltaPOC; j++ ) // cycle through pics in reference RPS.
858      {
859        Int RefDeltaPOC = (j<numRefDeltaPOC)? RPSRef->getDeltaPOC(j): 0;  // if it is the last decoded picture, set RefDeltaPOC = 0
860        rps->setRefIdc(j, 0);
861        for (Int k = 0; k < rps->getNumberOfPictures(); k++ )  // cycle through pics in current RPS.
862        {
863          if (rps->getDeltaPOC(k) == ( RefDeltaPOC + deltaRPS))  // if the current RPS has a same picture as the reference RPS.
864          {
865              rps->setRefIdc(j, (rps->getUsed(k)?1:2));
866              count++;
867              break;
868          }
869        }
870      }
871      if (count != rps->getNumberOfPictures())
872      {
873        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");
874        rps->setInterRPSPrediction(0);
875      }
876    }
877    else if (ge.m_interRPSPrediction == 1)  // inter RPS idc based on the RefIdc values provided in config file.
878    {
879      rps->setDeltaRPS(ge.m_deltaRPS);
880      rps->setNumRefIdc(ge.m_numRefIdc);
881      for (Int j = 0; j < ge.m_numRefIdc; j++ )
882      {
883        rps->setRefIdc(j, ge.m_refIdc[j]);
884      }
885#if WRITE_BACK
886      // the folowing code overwrite the deltaPOC and Used by current values read from the config file with the ones
887      // computed from the RefIdc.  A warning is printed if they are not identical.
888      numNeg = 0;
889      numPos = 0;
890      TComReferencePictureSet      RPSTemp;  // temporary variable
891
892      for (Int j = 0; j < ge.m_numRefIdc; j++ )
893      {
894        if (ge.m_refIdc[j])
895        {
896          Int deltaPOC = ge.m_deltaRPS + ((j < RPSRef->getNumberOfPictures())? RPSRef->getDeltaPOC(j) : 0);
897          RPSTemp.setDeltaPOC((numNeg+numPos),deltaPOC);
898          RPSTemp.setUsed((numNeg+numPos),ge.m_refIdc[j]==1?1:0);
899          if (deltaPOC<0)
900          {
901            numNeg++;
902          }
903          else
904          {
905            numPos++;
906          }
907        }
908      }
909      if (numNeg != rps->getNumberOfNegativePictures())
910      {
911        printf("Warning: number of negative pictures in RPS is different between intra and inter RPS specified in the config file.\n");
912        rps->setNumberOfNegativePictures(numNeg);
913        rps->setNumberOfPositivePictures(numNeg+numPos);
914      }
915      if (numPos != rps->getNumberOfPositivePictures())
916      {
917        printf("Warning: number of positive pictures in RPS is different between intra and inter RPS specified in the config file.\n");
918        rps->setNumberOfPositivePictures(numPos);
919        rps->setNumberOfPositivePictures(numNeg+numPos);
920      }
921      RPSTemp.setNumberOfPictures(numNeg+numPos);
922      RPSTemp.setNumberOfNegativePictures(numNeg);
923      RPSTemp.sortDeltaPOC();     // sort the created delta POC before comparing
924      // check if Delta POC and Used are the same
925      // print warning if they are not.
926      for (Int j = 0; j < ge.m_numRefIdc; j++ )
927      {
928        if (RPSTemp.getDeltaPOC(j) != rps->getDeltaPOC(j))
929        {
930          printf("Warning: delta POC is different between intra RPS and inter RPS specified in the config file.\n");
931          rps->setDeltaPOC(j,RPSTemp.getDeltaPOC(j));
932        }
933        if (RPSTemp.getUsed(j) != rps->getUsed(j))
934        {
935          printf("Warning: Used by Current in RPS is different between intra and inter RPS specified in the config file.\n");
936          rps->setUsed(j,RPSTemp.getUsed(j));
937        }
938      }
939#endif
940    }
941#else
942    rps->setInterRPSPrediction(ge.m_interRPSPrediction);
943    if (ge.m_interRPSPrediction)
944    {
945      rps->setDeltaRIdxMinus1(0);
946      rps->setDeltaRPS(ge.m_deltaRPS);
947      rps->setNumRefIdc(ge.m_numRefIdc);
948      for (Int j = 0; j < ge.m_numRefIdc; j++ )
949      {
950        rps->setRefIdc(j, ge.m_refIdc[j]);
951      }
952#if WRITE_BACK
953      // the folowing code overwrite the deltaPOC and Used by current values read from the config file with the ones
954      // computed from the RefIdc.  This is not necessary if both are identical. Currently there is no check to see if they are identical.
955      numNeg = 0;
956      numPos = 0;
957      TComReferencePictureSet*     RPSRef = m_RPSList.getReferencePictureSet(i-1);
958
959      for (Int j = 0; j < ge.m_numRefIdc; j++ )
960      {
961        if (ge.m_refIdc[j])
962        {
963          Int deltaPOC = ge.m_deltaRPS + ((j < RPSRef->getNumberOfPictures())? RPSRef->getDeltaPOC(j) : 0);
964          rps->setDeltaPOC((numNeg+numPos),deltaPOC);
965          rps->setUsed((numNeg+numPos),ge.m_refIdc[j]==1?1:0);
966          if (deltaPOC<0)
967          {
968            numNeg++;
969          }
970          else
971          {
972            numPos++;
973          }
974        }
975      }
976      rps->setNumberOfNegativePictures(numNeg);
977      rps->setNumberOfPositivePictures(numPos);
978      rps->sortDeltaPOC();
979#endif
980    }
981#endif //INTER_RPS_AUTO
982  }
983 
984}
985
986   // This is a function that
987   // determines what Reference Picture Set to use
988   // for a specific slice (with POC = POCCurr)
989Void TEncTop::selectReferencePictureSet(TComSlice* slice, Int POCCurr, Int GOPid )
990{
991#if H_MV
992  if( slice->getRapPicFlag() == true && getLayerId() > 0 && POCCurr == 0 )
993  {
994    TComReferencePictureSet* rps = slice->getLocalRPS();
995    rps->setNumberOfNegativePictures(0);
996    rps->setNumberOfPositivePictures(0);
997    rps->setNumberOfLongtermPictures(0);
998    rps->setNumberOfPictures(0);
999    slice->setRPS(rps);
1000  }
1001  else
1002  {
1003#endif
1004  slice->setRPSidx(GOPid);
1005
1006  for(Int extraNum=m_iGOPSize; extraNum<m_extraRPSs+m_iGOPSize; extraNum++)
1007  {   
1008    if(m_uiIntraPeriod > 0 && getDecodingRefreshType() > 0)
1009    {
1010      Int POCIndex = POCCurr%m_uiIntraPeriod;
1011      if(POCIndex == 0)
1012      {
1013        POCIndex = m_uiIntraPeriod;
1014      }
1015      if(POCIndex == m_GOPList[extraNum].m_POC)
1016      {
1017        slice->setRPSidx(extraNum);
1018      }
1019    }
1020    else
1021    {
1022      if(POCCurr==m_GOPList[extraNum].m_POC)
1023      {
1024        slice->setRPSidx(extraNum);
1025      }
1026    }
1027  }
1028
1029  slice->setRPS(getSPS()->getRPSList()->getReferencePictureSet(slice->getRPSidx()));
1030  slice->getRPS()->setNumberOfPictures(slice->getRPS()->getNumberOfNegativePictures()+slice->getRPS()->getNumberOfPositivePictures());
1031#if H_MV
1032  }
1033#endif
1034
1035}
1036
1037Int TEncTop::getReferencePictureSetIdxForSOP(TComSlice* slice, Int POCCurr, Int GOPid )
1038{
1039  int rpsIdx = GOPid;
1040
1041  for(Int extraNum=m_iGOPSize; extraNum<m_extraRPSs+m_iGOPSize; extraNum++)
1042  {   
1043    if(m_uiIntraPeriod > 0 && getDecodingRefreshType() > 0)
1044    {
1045      Int POCIndex = POCCurr%m_uiIntraPeriod;
1046      if(POCIndex == 0)
1047      {
1048        POCIndex = m_uiIntraPeriod;
1049      }
1050      if(POCIndex == m_GOPList[extraNum].m_POC)
1051      {
1052        rpsIdx = extraNum;
1053      }
1054    }
1055    else
1056    {
1057      if(POCCurr==m_GOPList[extraNum].m_POC)
1058      {
1059        rpsIdx = extraNum;
1060      }
1061    }
1062  }
1063
1064  return rpsIdx;
1065}
1066
1067Void  TEncTop::xInitPPSforTiles()
1068{
1069  m_cPPS.setUniformSpacingFlag( m_iUniformSpacingIdr );
1070  m_cPPS.setNumColumnsMinus1( m_iNumColumnsMinus1 );
1071  m_cPPS.setNumRowsMinus1( m_iNumRowsMinus1 );
1072  if( m_iUniformSpacingIdr == 0 )
1073  {
1074    m_cPPS.setColumnWidth( m_puiColumnWidth );
1075    m_cPPS.setRowHeight( m_puiRowHeight );
1076  }
1077  m_cPPS.setLoopFilterAcrossTilesEnabledFlag( m_loopFilterAcrossTilesEnabledFlag );
1078
1079  // # substreams is "per tile" when tiles are independent.
1080  if (m_iWaveFrontSynchro
1081    )
1082  {
1083    m_cPPS.setNumSubstreams(m_iWaveFrontSubstreams * (m_iNumColumnsMinus1+1));
1084  }
1085}
1086
1087Void  TEncCfg::xCheckGSParameters()
1088{
1089  Int   iWidthInCU = ( m_iSourceWidth%g_uiMaxCUWidth ) ? m_iSourceWidth/g_uiMaxCUWidth + 1 : m_iSourceWidth/g_uiMaxCUWidth;
1090  Int   iHeightInCU = ( m_iSourceHeight%g_uiMaxCUHeight ) ? m_iSourceHeight/g_uiMaxCUHeight + 1 : m_iSourceHeight/g_uiMaxCUHeight;
1091  UInt  uiCummulativeColumnWidth = 0;
1092  UInt  uiCummulativeRowHeight = 0;
1093
1094  //check the column relative parameters
1095  if( m_iNumColumnsMinus1 >= (1<<(LOG2_MAX_NUM_COLUMNS_MINUS1+1)) )
1096  {
1097    printf( "The number of columns is larger than the maximum allowed number of columns.\n" );
1098    exit( EXIT_FAILURE );
1099  }
1100
1101  if( m_iNumColumnsMinus1 >= iWidthInCU )
1102  {
1103    printf( "The current picture can not have so many columns.\n" );
1104    exit( EXIT_FAILURE );
1105  }
1106
1107  if( m_iNumColumnsMinus1 && m_iUniformSpacingIdr==0 )
1108  {
1109    for(Int i=0; i<m_iNumColumnsMinus1; i++)
1110    {
1111      uiCummulativeColumnWidth += m_puiColumnWidth[i];
1112    }
1113
1114    if( uiCummulativeColumnWidth >= iWidthInCU )
1115    {
1116      printf( "The width of the column is too large.\n" );
1117      exit( EXIT_FAILURE );
1118    }
1119  }
1120
1121  //check the row relative parameters
1122  if( m_iNumRowsMinus1 >= (1<<(LOG2_MAX_NUM_ROWS_MINUS1+1)) )
1123  {
1124    printf( "The number of rows is larger than the maximum allowed number of rows.\n" );
1125    exit( EXIT_FAILURE );
1126  }
1127
1128  if( m_iNumRowsMinus1 >= iHeightInCU )
1129  {
1130    printf( "The current picture can not have so many rows.\n" );
1131    exit( EXIT_FAILURE );
1132  }
1133
1134  if( m_iNumRowsMinus1 && m_iUniformSpacingIdr==0 )
1135  {
1136    for(Int i=0; i<m_iNumRowsMinus1; i++)
1137      uiCummulativeRowHeight += m_puiRowHeight[i];
1138
1139    if( uiCummulativeRowHeight >= iHeightInCU )
1140    {
1141      printf( "The height of the row is too large.\n" );
1142      exit( EXIT_FAILURE );
1143    }
1144  }
1145}
1146#if H_MV
1147Void TEncTop::printSummary( Int numAllPicCoded )
1148{
1149  assert (numAllPicCoded == m_cAnalyzeAll.getNumPic());
1150
1151  //--CFG_KDY
1152  m_cAnalyzeAll.setFrmRate( getFrameRate() );
1153  m_cAnalyzeI.setFrmRate( getFrameRate() );
1154  m_cAnalyzeP.setFrmRate( getFrameRate() );
1155  m_cAnalyzeB.setFrmRate( getFrameRate() );
1156
1157  //-- all
1158  printf( "\n\nSUMMARY ------------------------------------------- LayerId %2d\n", m_layerId );
1159
1160  m_cAnalyzeAll.printOut('a');
1161
1162  printf( "\n\nI Slices--------------------------------------------------------\n" );
1163  m_cAnalyzeI.printOut('i');
1164
1165  printf( "\n\nP Slices--------------------------------------------------------\n" );
1166  m_cAnalyzeP.printOut('p');
1167
1168  printf( "\n\nB Slices--------------------------------------------------------\n" );
1169  m_cAnalyzeB.printOut('b');
1170
1171#if _SUMMARY_OUT_
1172  m_cAnalyzeAll.printSummaryOut();
1173#endif
1174#if _SUMMARY_PIC_
1175  m_cAnalyzeI.printSummary('I');
1176  m_cAnalyzeP.printSummary('P');
1177  m_cAnalyzeB.printSummary('B');
1178#endif
1179}
1180
1181Int TEncTop::getFrameId(Int iGOPid) 
1182{
1183  if(m_iPOCLast == 0)
1184  {
1185    return(0 );
1186  }
1187  else
1188  {
1189    return m_iPOCLast -m_iNumPicRcvd+ getGOPEntry(iGOPid).m_POC ;
1190  }
1191}
1192
1193TComPic* TEncTop::getPic( Int poc )
1194{
1195  TComList<TComPic*>* listPic = getListPic();
1196  TComPic* pcPic = NULL;
1197  for(TComList<TComPic*>::iterator it=listPic->begin(); it!=listPic->end(); it++)
1198  {
1199    if( (*it)->getPOC() == poc )
1200    {
1201      pcPic = *it ;
1202      break ;
1203    }
1204  }
1205  return pcPic;
1206}
1207#endif
1208
1209#if H_3D_VSO
1210Void TEncTop::setupRenModel( Int iPoc, Int iEncViewIdx, Int iEncContent, Int iHorOffset )
1211{
1212  TRenModel* rendererModel = m_cRdCost.getRenModel(); 
1213  rendererModel->setupPart( iHorOffset, std::min( (Int) g_uiMaxCUHeight, (Int) ( m_iSourceHeight - iHorOffset ) )) ; 
1214 
1215  Int iEncViewSIdx = m_cameraParameters->getBaseId2SortedId()[ iEncViewIdx ];
1216
1217  // setup base views
1218  Int iNumOfBV = m_renderModelParameters->getNumOfBaseViewsForView( iEncViewSIdx, iEncContent );
1219
1220  for (Int iCurView = 0; iCurView < iNumOfBV; iCurView++ )
1221  {
1222    Int iBaseViewSIdx;
1223    Int iVideoDistMode;
1224    Int iDepthDistMode;
1225
1226    m_renderModelParameters->getBaseViewData( iEncViewSIdx, iEncContent, iCurView, iBaseViewSIdx, iVideoDistMode, iDepthDistMode );
1227
1228    AOT( iVideoDistMode < 0 || iVideoDistMode > 2 );
1229
1230    Int iBaseViewIdx = m_cameraParameters->getBaseSortedId2Id()[ iBaseViewSIdx ];
1231
1232    TComPicYuv* pcPicYuvVideoRec  = m_ivPicLists->getPicYuv( iBaseViewIdx, false, iPoc, true  );
1233    TComPicYuv* pcPicYuvDepthRec  = m_ivPicLists->getPicYuv( iBaseViewIdx, true , iPoc, true  );
1234    TComPicYuv* pcPicYuvVideoOrg  = m_ivPicLists->getPicYuv( iBaseViewIdx, false, iPoc, false );
1235    TComPicYuv* pcPicYuvDepthOrg  = m_ivPicLists->getPicYuv( iBaseViewIdx, true , iPoc, false );   
1236
1237    TComPicYuv* pcPicYuvVideoRef  = ( iVideoDistMode == 2 ) ? pcPicYuvVideoOrg  : NULL;
1238    TComPicYuv* pcPicYuvDepthRef  = ( iDepthDistMode == 2 ) ? pcPicYuvDepthOrg  : NULL;
1239
1240    TComPicYuv* pcPicYuvVideoTest = ( iVideoDistMode == 0 ) ? pcPicYuvVideoOrg  : pcPicYuvVideoRec;
1241    TComPicYuv* pcPicYuvDepthTest = ( iDepthDistMode == 0 ) ? pcPicYuvDepthOrg  : pcPicYuvDepthRec;
1242
1243    AOT( (iVideoDistMode == 2) != (pcPicYuvVideoRef != NULL) );
1244    AOT( (iDepthDistMode == 2) != (pcPicYuvDepthRef != NULL) );
1245    AOT( pcPicYuvDepthTest == NULL );
1246    AOT( pcPicYuvVideoTest == NULL );
1247
1248    rendererModel->setBaseView( iBaseViewSIdx, pcPicYuvVideoTest, pcPicYuvDepthTest, pcPicYuvVideoRef, pcPicYuvDepthRef );
1249  }
1250
1251  rendererModel->setErrorMode( iEncViewSIdx, iEncContent, 0 );
1252  // setup virtual views
1253  Int iNumOfSV  = m_renderModelParameters->getNumOfModelsForView( iEncViewSIdx, iEncContent );
1254  for (Int iCurView = 0; iCurView < iNumOfSV; iCurView++ )
1255  {
1256    Int iOrgRefBaseViewSIdx;
1257    Int iLeftBaseViewSIdx;
1258    Int iRightBaseViewSIdx;
1259    Int iSynthViewRelNum;
1260    Int iModelNum;
1261    Int iBlendMode;
1262    m_renderModelParameters->getSingleModelData(iEncViewSIdx, iEncContent, iCurView, iModelNum, iBlendMode,iLeftBaseViewSIdx, iRightBaseViewSIdx, iOrgRefBaseViewSIdx, iSynthViewRelNum );
1263
1264    Int iLeftBaseViewIdx    = -1;
1265    Int iRightBaseViewIdx   = -1;
1266
1267    TComPicYuv* pcPicYuvOrgRef  = NULL;
1268    Int**      ppiShiftLUTLeft  = NULL;
1269    Int**      ppiShiftLUTRight = NULL;
1270    Int**      ppiBaseShiftLUTLeft  = NULL;
1271    Int**      ppiBaseShiftLUTRight = NULL;
1272
1273
1274    Int        iDistToLeft      = -1;
1275
1276    Int iSynthViewIdx = m_cameraParameters->synthRelNum2Idx( iSynthViewRelNum );
1277
1278    if ( iLeftBaseViewSIdx != -1 )
1279    {
1280      iLeftBaseViewIdx   = m_cameraParameters->getBaseSortedId2Id()   [ iLeftBaseViewSIdx ];
1281      ppiShiftLUTLeft    = m_cameraParameters->getSynthViewShiftLUTI()[ iLeftBaseViewIdx  ][ iSynthViewIdx  ];
1282    }
1283
1284    if ( iRightBaseViewSIdx != -1 )
1285    {
1286      iRightBaseViewIdx  = m_cameraParameters->getBaseSortedId2Id()   [iRightBaseViewSIdx ];
1287      ppiShiftLUTRight   = m_cameraParameters->getSynthViewShiftLUTI()[ iRightBaseViewIdx ][ iSynthViewIdx ];
1288    }
1289
1290    if ( iRightBaseViewSIdx != -1 && iLeftBaseViewSIdx != -1 )
1291    {
1292      iDistToLeft          = m_cameraParameters->getRelDistLeft(  iSynthViewIdx , iLeftBaseViewIdx, iRightBaseViewIdx);
1293      ppiBaseShiftLUTLeft  = m_cameraParameters->getBaseViewShiftLUTI() [ iLeftBaseViewIdx  ][ iRightBaseViewIdx ];
1294      ppiBaseShiftLUTRight = m_cameraParameters->getBaseViewShiftLUTI() [ iRightBaseViewIdx ][ iLeftBaseViewIdx  ];
1295
1296    }
1297
1298    if ( iOrgRefBaseViewSIdx != -1 )
1299    {
1300      pcPicYuvOrgRef = m_ivPicLists->getPicYuv(  m_cameraParameters->getBaseSortedId2Id()[ iOrgRefBaseViewSIdx ] , false, iPoc, false );
1301      AOF ( pcPicYuvOrgRef );
1302    }
1303
1304    rendererModel->setSingleModel( iModelNum, ppiShiftLUTLeft, ppiBaseShiftLUTLeft, ppiShiftLUTRight, ppiBaseShiftLUTRight, iDistToLeft, pcPicYuvOrgRef );
1305  }
1306}
1307#endif
1308//! \}
Note: See TracBrowser for help on using the repository browser.