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

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

Incorporated further encoder parameters.

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