source: 3DVCSoftware/branches/HTM-DEV-2.0-dev2-Sharp/source/Lib/TLibEncoder/TEncTop.cpp @ 550

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

Further removal of unused macros.

  • 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#if H_MV
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  rpcPic->getPicYuvOrg()->setBorderExtension(false);
514}
515
516Void TEncTop::xInitSPS()
517{
518#if H_MV
519  m_cSPS.setSPSId( getLayerIdInVps() );
520  m_cSPS.setLayerId( getLayerId() );
521#endif
522  ProfileTierLevel& profileTierLevel = *m_cSPS.getPTL()->getGeneralPTL();
523  profileTierLevel.setLevelIdc(m_level);
524  profileTierLevel.setTierFlag(m_levelTier);
525  profileTierLevel.setProfileIdc(m_profile);
526  profileTierLevel.setProfileCompatibilityFlag(m_profile, 1);
527  profileTierLevel.setProgressiveSourceFlag(m_progressiveSourceFlag);
528  profileTierLevel.setInterlacedSourceFlag(m_interlacedSourceFlag);
529  profileTierLevel.setNonPackedConstraintFlag(m_nonPackedConstraintFlag);
530  profileTierLevel.setFrameOnlyConstraintFlag(m_frameOnlyConstraintFlag);
531 
532  if (m_profile == Profile::MAIN10 && g_bitDepthY == 8 && g_bitDepthC == 8)
533  {
534    /* The above constraint is equal to Profile::MAIN */
535    profileTierLevel.setProfileCompatibilityFlag(Profile::MAIN, 1);
536  }
537  if (m_profile == Profile::MAIN)
538  {
539    /* A Profile::MAIN10 decoder can always decode Profile::MAIN */
540    profileTierLevel.setProfileCompatibilityFlag(Profile::MAIN10, 1);
541  }
542  /* XXX: should Main be marked as compatible with still picture? */
543  /* XXX: may be a good idea to refactor the above into a function
544   * that chooses the actual compatibility based upon options */
545
546  m_cSPS.setPicWidthInLumaSamples         ( m_iSourceWidth      );
547  m_cSPS.setPicHeightInLumaSamples        ( m_iSourceHeight     );
548  m_cSPS.setConformanceWindow             ( m_conformanceWindow );
549  m_cSPS.setMaxCUWidth    ( g_uiMaxCUWidth      );
550  m_cSPS.setMaxCUHeight   ( g_uiMaxCUHeight     );
551  m_cSPS.setMaxCUDepth    ( g_uiMaxCUDepth      );
552
553  Int minCUSize = m_cSPS.getMaxCUWidth() >> ( m_cSPS.getMaxCUDepth()-g_uiAddCUDepth );
554  Int log2MinCUSize = 0;
555  while(minCUSize > 1)
556  {
557    minCUSize >>= 1;
558    log2MinCUSize++;
559  }
560
561  m_cSPS.setLog2MinCodingBlockSize(log2MinCUSize);
562  m_cSPS.setLog2DiffMaxMinCodingBlockSize(m_cSPS.getMaxCUDepth()-g_uiAddCUDepth);
563 
564  m_cSPS.setPCMLog2MinSize (m_uiPCMLog2MinSize);
565  m_cSPS.setUsePCM        ( m_usePCM           );
566  m_cSPS.setPCMLog2MaxSize( m_pcmLog2MaxSize  );
567
568  m_cSPS.setQuadtreeTULog2MaxSize( m_uiQuadtreeTULog2MaxSize );
569  m_cSPS.setQuadtreeTULog2MinSize( m_uiQuadtreeTULog2MinSize );
570  m_cSPS.setQuadtreeTUMaxDepthInter( m_uiQuadtreeTUMaxDepthInter    );
571  m_cSPS.setQuadtreeTUMaxDepthIntra( m_uiQuadtreeTUMaxDepthIntra    );
572 
573  m_cSPS.setTMVPFlagsPresent(false);
574  m_cSPS.setUseLossless   ( m_useLossless  );
575
576  m_cSPS.setMaxTrSize   ( 1 << m_uiQuadtreeTULog2MaxSize );
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#if H_3D_QTLPC
589  m_cSPS.setUseQTL( m_bUseQTL );
590  m_cSPS.setUsePC ( m_bUsePC  );
591#endif
592
593  for (i = g_uiMaxCUDepth-g_uiAddCUDepth; i < g_uiMaxCUDepth; i++ )
594  {
595    m_cSPS.setAMPAcc(i, 0);
596  }
597
598  m_cSPS.setBitDepthY( g_bitDepthY );
599  m_cSPS.setBitDepthC( g_bitDepthC );
600
601  m_cSPS.setQpBDOffsetY ( 6*(g_bitDepthY - 8) );
602  m_cSPS.setQpBDOffsetC ( 6*(g_bitDepthC - 8) );
603
604  m_cSPS.setUseSAO( m_bUseSAO );
605
606  m_cSPS.setMaxTLayers( m_maxTempLayer );
607  m_cSPS.setTemporalIdNestingFlag( ( m_maxTempLayer == 1 ) ? true : false );
608  for ( i = 0; i < m_cSPS.getMaxTLayers(); i++ )
609  {
610    m_cSPS.setMaxDecPicBuffering(m_maxDecPicBuffering[i], i);
611    m_cSPS.setNumReorderPics(m_numReorderPics[i], i);
612  }
613  m_cSPS.setPCMBitDepthLuma (g_uiPCMBitDepthLuma);
614  m_cSPS.setPCMBitDepthChroma (g_uiPCMBitDepthChroma);
615  m_cSPS.setPCMFilterDisableFlag  ( m_bPCMFilterDisableFlag );
616
617  m_cSPS.setScalingListFlag ( (m_useScalingListId == 0) ? 0 : 1 );
618
619  m_cSPS.setUseStrongIntraSmoothing( m_useStrongIntraSmoothing );
620
621  m_cSPS.setVuiParametersPresentFlag(getVuiParametersPresentFlag());
622  if (m_cSPS.getVuiParametersPresentFlag())
623  {
624    TComVUI* pcVUI = m_cSPS.getVuiParameters();
625    pcVUI->setAspectRatioInfoPresentFlag(getAspectRatioIdc() != -1);
626    pcVUI->setAspectRatioIdc(getAspectRatioIdc());
627    pcVUI->setSarWidth(getSarWidth());
628    pcVUI->setSarHeight(getSarHeight());
629    pcVUI->setOverscanInfoPresentFlag(getOverscanInfoPresentFlag());
630    pcVUI->setOverscanAppropriateFlag(getOverscanAppropriateFlag());
631    pcVUI->setVideoSignalTypePresentFlag(getVideoSignalTypePresentFlag());
632    pcVUI->setVideoFormat(getVideoFormat());
633    pcVUI->setVideoFullRangeFlag(getVideoFullRangeFlag());
634    pcVUI->setColourDescriptionPresentFlag(getColourDescriptionPresentFlag());
635    pcVUI->setColourPrimaries(getColourPrimaries());
636    pcVUI->setTransferCharacteristics(getTransferCharacteristics());
637    pcVUI->setMatrixCoefficients(getMatrixCoefficients());
638    pcVUI->setChromaLocInfoPresentFlag(getChromaLocInfoPresentFlag());
639    pcVUI->setChromaSampleLocTypeTopField(getChromaSampleLocTypeTopField());
640    pcVUI->setChromaSampleLocTypeBottomField(getChromaSampleLocTypeBottomField());
641    pcVUI->setNeutralChromaIndicationFlag(getNeutralChromaIndicationFlag());
642    pcVUI->setDefaultDisplayWindow(getDefaultDisplayWindow());
643    pcVUI->setFrameFieldInfoPresentFlag(getFrameFieldInfoPresentFlag());
644    pcVUI->setFieldSeqFlag(false);
645    pcVUI->setHrdParametersPresentFlag(false);
646    pcVUI->getTimingInfo()->setPocProportionalToTimingFlag(getPocProportionalToTimingFlag());
647    pcVUI->getTimingInfo()->setNumTicksPocDiffOneMinus1   (getNumTicksPocDiffOneMinus1()   );
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( getVPS()->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  assert(bestPos <= 15);
777  m_cPPS.setNumRefIdxL0DefaultActive(bestPos);
778  m_cPPS.setNumRefIdxL1DefaultActive(bestPos);
779  m_cPPS.setTransquantBypassEnableFlag(getTransquantBypassEnableFlag());
780  m_cPPS.setUseTransformSkip( m_useTransformSkip );
781  if (m_sliceSegmentMode)
782  {
783    m_cPPS.setDependentSliceSegmentsEnabledFlag( true );
784  }
785  if( m_cPPS.getDependentSliceSegmentsEnabledFlag() )
786  {
787    Int NumCtx = m_cPPS.getEntropyCodingSyncEnabledFlag()?2:1;
788    m_cSliceEncoder.initCtxMem( NumCtx );
789    for ( UInt st = 0; st < NumCtx; st++ )
790    {
791      TEncSbac* ctx = NULL;
792      ctx = new TEncSbac;
793      ctx->init( &m_cBinCoderCABAC );
794      m_cSliceEncoder.setCtxMem( ctx, st );
795    }
796  }
797#if H_3D
798  if( m_cSPS.hasCamParInSliceHeader() )
799  {
800    m_cPPS.setSliceHeaderExtensionPresentFlag( true ); 
801  }
802#endif
803}
804
805//Function for initializing m_RPSList, a list of TComReferencePictureSet, based on the GOPEntry objects read from the config file.
806Void TEncTop::xInitRPS()
807{
808  TComReferencePictureSet*      rps;
809 
810  m_cSPS.createRPSList(getGOPSize()+m_extraRPSs);
811  TComRPSList* rpsList = m_cSPS.getRPSList();
812
813  for( Int i = 0; i < getGOPSize()+m_extraRPSs; i++) 
814  {
815    GOPEntry ge = getGOPEntry(i);
816    rps = rpsList->getReferencePictureSet(i);
817    rps->setNumberOfPictures(ge.m_numRefPics);
818    rps->setNumRefIdc(ge.m_numRefIdc);
819    Int numNeg = 0;
820    Int numPos = 0;
821    for( Int j = 0; j < ge.m_numRefPics; j++)
822    {
823      rps->setDeltaPOC(j,ge.m_referencePics[j]);
824      rps->setUsed(j,ge.m_usedByCurrPic[j]);
825      if(ge.m_referencePics[j]>0)
826      {
827        numPos++;
828      }
829      else
830      {
831        numNeg++;
832      }
833    }
834    rps->setNumberOfNegativePictures(numNeg);
835    rps->setNumberOfPositivePictures(numPos);
836
837    // handle inter RPS intialization from the config file.
838#if AUTO_INTER_RPS
839    rps->setInterRPSPrediction(ge.m_interRPSPrediction > 0);  // not very clean, converting anything > 0 to true.
840    rps->setDeltaRIdxMinus1(0);                               // index to the Reference RPS is always the previous one.
841    TComReferencePictureSet*     RPSRef = rpsList->getReferencePictureSet(i-1);  // get the reference RPS
842
843    if (ge.m_interRPSPrediction == 2)  // Automatic generation of the inter RPS idc based on the RIdx provided.
844    {
845      Int deltaRPS = getGOPEntry(i-1).m_POC - ge.m_POC;  // the ref POC - current POC
846      Int numRefDeltaPOC = RPSRef->getNumberOfPictures();
847
848      rps->setDeltaRPS(deltaRPS);           // set delta RPS
849      rps->setNumRefIdc(numRefDeltaPOC+1);  // set the numRefIdc to the number of pictures in the reference RPS + 1.
850      Int count=0;
851      for (Int j = 0; j <= numRefDeltaPOC; j++ ) // cycle through pics in reference RPS.
852      {
853        Int RefDeltaPOC = (j<numRefDeltaPOC)? RPSRef->getDeltaPOC(j): 0;  // if it is the last decoded picture, set RefDeltaPOC = 0
854        rps->setRefIdc(j, 0);
855        for (Int k = 0; k < rps->getNumberOfPictures(); k++ )  // cycle through pics in current RPS.
856        {
857          if (rps->getDeltaPOC(k) == ( RefDeltaPOC + deltaRPS))  // if the current RPS has a same picture as the reference RPS.
858          {
859              rps->setRefIdc(j, (rps->getUsed(k)?1:2));
860              count++;
861              break;
862          }
863        }
864      }
865      if (count != rps->getNumberOfPictures())
866      {
867        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");
868        rps->setInterRPSPrediction(0);
869      }
870    }
871    else if (ge.m_interRPSPrediction == 1)  // inter RPS idc based on the RefIdc values provided in config file.
872    {
873      rps->setDeltaRPS(ge.m_deltaRPS);
874      rps->setNumRefIdc(ge.m_numRefIdc);
875      for (Int j = 0; j < ge.m_numRefIdc; j++ )
876      {
877        rps->setRefIdc(j, ge.m_refIdc[j]);
878      }
879#if WRITE_BACK
880      // the folowing code overwrite the deltaPOC and Used by current values read from the config file with the ones
881      // computed from the RefIdc.  A warning is printed if they are not identical.
882      numNeg = 0;
883      numPos = 0;
884      TComReferencePictureSet      RPSTemp;  // temporary variable
885
886      for (Int j = 0; j < ge.m_numRefIdc; j++ )
887      {
888        if (ge.m_refIdc[j])
889        {
890          Int deltaPOC = ge.m_deltaRPS + ((j < RPSRef->getNumberOfPictures())? RPSRef->getDeltaPOC(j) : 0);
891          RPSTemp.setDeltaPOC((numNeg+numPos),deltaPOC);
892          RPSTemp.setUsed((numNeg+numPos),ge.m_refIdc[j]==1?1:0);
893          if (deltaPOC<0)
894          {
895            numNeg++;
896          }
897          else
898          {
899            numPos++;
900          }
901        }
902      }
903      if (numNeg != rps->getNumberOfNegativePictures())
904      {
905        printf("Warning: number of negative pictures in RPS is different between intra and inter RPS specified in the config file.\n");
906        rps->setNumberOfNegativePictures(numNeg);
907        rps->setNumberOfPositivePictures(numNeg+numPos);
908      }
909      if (numPos != rps->getNumberOfPositivePictures())
910      {
911        printf("Warning: number of positive pictures in RPS is different between intra and inter RPS specified in the config file.\n");
912        rps->setNumberOfPositivePictures(numPos);
913        rps->setNumberOfPositivePictures(numNeg+numPos);
914      }
915      RPSTemp.setNumberOfPictures(numNeg+numPos);
916      RPSTemp.setNumberOfNegativePictures(numNeg);
917      RPSTemp.sortDeltaPOC();     // sort the created delta POC before comparing
918      // check if Delta POC and Used are the same
919      // print warning if they are not.
920      for (Int j = 0; j < ge.m_numRefIdc; j++ )
921      {
922        if (RPSTemp.getDeltaPOC(j) != rps->getDeltaPOC(j))
923        {
924          printf("Warning: delta POC is different between intra RPS and inter RPS specified in the config file.\n");
925          rps->setDeltaPOC(j,RPSTemp.getDeltaPOC(j));
926        }
927        if (RPSTemp.getUsed(j) != rps->getUsed(j))
928        {
929          printf("Warning: Used by Current in RPS is different between intra and inter RPS specified in the config file.\n");
930          rps->setUsed(j,RPSTemp.getUsed(j));
931        }
932      }
933#endif
934    }
935#else
936    rps->setInterRPSPrediction(ge.m_interRPSPrediction);
937    if (ge.m_interRPSPrediction)
938    {
939      rps->setDeltaRIdxMinus1(0);
940      rps->setDeltaRPS(ge.m_deltaRPS);
941      rps->setNumRefIdc(ge.m_numRefIdc);
942      for (Int j = 0; j < ge.m_numRefIdc; j++ )
943      {
944        rps->setRefIdc(j, ge.m_refIdc[j]);
945      }
946#if WRITE_BACK
947      // the folowing code overwrite the deltaPOC and Used by current values read from the config file with the ones
948      // computed from the RefIdc.  This is not necessary if both are identical. Currently there is no check to see if they are identical.
949      numNeg = 0;
950      numPos = 0;
951      TComReferencePictureSet*     RPSRef = m_RPSList.getReferencePictureSet(i-1);
952
953      for (Int j = 0; j < ge.m_numRefIdc; j++ )
954      {
955        if (ge.m_refIdc[j])
956        {
957          Int deltaPOC = ge.m_deltaRPS + ((j < RPSRef->getNumberOfPictures())? RPSRef->getDeltaPOC(j) : 0);
958          rps->setDeltaPOC((numNeg+numPos),deltaPOC);
959          rps->setUsed((numNeg+numPos),ge.m_refIdc[j]==1?1:0);
960          if (deltaPOC<0)
961          {
962            numNeg++;
963          }
964          else
965          {
966            numPos++;
967          }
968        }
969      }
970      rps->setNumberOfNegativePictures(numNeg);
971      rps->setNumberOfPositivePictures(numPos);
972      rps->sortDeltaPOC();
973#endif
974    }
975#endif //INTER_RPS_AUTO
976  }
977 
978}
979
980   // This is a function that
981   // determines what Reference Picture Set to use
982   // for a specific slice (with POC = POCCurr)
983Void TEncTop::selectReferencePictureSet(TComSlice* slice, Int POCCurr, Int GOPid )
984{
985#if H_MV
986  if( slice->getRapPicFlag() == true && getLayerId() > 0 && POCCurr == 0 )
987  {
988    TComReferencePictureSet* rps = slice->getLocalRPS();
989    rps->setNumberOfNegativePictures(0);
990    rps->setNumberOfPositivePictures(0);
991    rps->setNumberOfLongtermPictures(0);
992    rps->setNumberOfPictures(0);
993    slice->setRPS(rps);
994  }
995  else
996  {
997#endif
998  slice->setRPSidx(GOPid);
999
1000  for(Int extraNum=m_iGOPSize; extraNum<m_extraRPSs+m_iGOPSize; extraNum++)
1001  {   
1002    if(m_uiIntraPeriod > 0 && getDecodingRefreshType() > 0)
1003    {
1004      Int POCIndex = POCCurr%m_uiIntraPeriod;
1005      if(POCIndex == 0)
1006      {
1007        POCIndex = m_uiIntraPeriod;
1008      }
1009      if(POCIndex == m_GOPList[extraNum].m_POC)
1010      {
1011        slice->setRPSidx(extraNum);
1012      }
1013    }
1014    else
1015    {
1016      if(POCCurr==m_GOPList[extraNum].m_POC)
1017      {
1018        slice->setRPSidx(extraNum);
1019      }
1020    }
1021  }
1022
1023  slice->setRPS(getSPS()->getRPSList()->getReferencePictureSet(slice->getRPSidx()));
1024  slice->getRPS()->setNumberOfPictures(slice->getRPS()->getNumberOfNegativePictures()+slice->getRPS()->getNumberOfPositivePictures());
1025#if H_MV
1026  }
1027#endif
1028
1029}
1030
1031Int TEncTop::getReferencePictureSetIdxForSOP(TComSlice* slice, Int POCCurr, Int GOPid )
1032{
1033  int rpsIdx = GOPid;
1034
1035  for(Int extraNum=m_iGOPSize; extraNum<m_extraRPSs+m_iGOPSize; extraNum++)
1036  {   
1037    if(m_uiIntraPeriod > 0 && getDecodingRefreshType() > 0)
1038    {
1039      Int POCIndex = POCCurr%m_uiIntraPeriod;
1040      if(POCIndex == 0)
1041      {
1042        POCIndex = m_uiIntraPeriod;
1043      }
1044      if(POCIndex == m_GOPList[extraNum].m_POC)
1045      {
1046        rpsIdx = extraNum;
1047      }
1048    }
1049    else
1050    {
1051      if(POCCurr==m_GOPList[extraNum].m_POC)
1052      {
1053        rpsIdx = extraNum;
1054      }
1055    }
1056  }
1057
1058  return rpsIdx;
1059}
1060
1061Void  TEncTop::xInitPPSforTiles()
1062{
1063  m_cPPS.setUniformSpacingFlag( m_iUniformSpacingIdr );
1064  m_cPPS.setNumColumnsMinus1( m_iNumColumnsMinus1 );
1065  m_cPPS.setNumRowsMinus1( m_iNumRowsMinus1 );
1066  if( m_iUniformSpacingIdr == 0 )
1067  {
1068    m_cPPS.setColumnWidth( m_puiColumnWidth );
1069    m_cPPS.setRowHeight( m_puiRowHeight );
1070  }
1071  m_cPPS.setLoopFilterAcrossTilesEnabledFlag( m_loopFilterAcrossTilesEnabledFlag );
1072
1073  // # substreams is "per tile" when tiles are independent.
1074  if (m_iWaveFrontSynchro
1075    )
1076  {
1077    m_cPPS.setNumSubstreams(m_iWaveFrontSubstreams * (m_iNumColumnsMinus1+1));
1078  }
1079}
1080
1081Void  TEncCfg::xCheckGSParameters()
1082{
1083  Int   iWidthInCU = ( m_iSourceWidth%g_uiMaxCUWidth ) ? m_iSourceWidth/g_uiMaxCUWidth + 1 : m_iSourceWidth/g_uiMaxCUWidth;
1084  Int   iHeightInCU = ( m_iSourceHeight%g_uiMaxCUHeight ) ? m_iSourceHeight/g_uiMaxCUHeight + 1 : m_iSourceHeight/g_uiMaxCUHeight;
1085  UInt  uiCummulativeColumnWidth = 0;
1086  UInt  uiCummulativeRowHeight = 0;
1087
1088  //check the column relative parameters
1089  if( m_iNumColumnsMinus1 >= (1<<(LOG2_MAX_NUM_COLUMNS_MINUS1+1)) )
1090  {
1091    printf( "The number of columns is larger than the maximum allowed number of columns.\n" );
1092    exit( EXIT_FAILURE );
1093  }
1094
1095  if( m_iNumColumnsMinus1 >= iWidthInCU )
1096  {
1097    printf( "The current picture can not have so many columns.\n" );
1098    exit( EXIT_FAILURE );
1099  }
1100
1101  if( m_iNumColumnsMinus1 && m_iUniformSpacingIdr==0 )
1102  {
1103    for(Int i=0; i<m_iNumColumnsMinus1; i++)
1104    {
1105      uiCummulativeColumnWidth += m_puiColumnWidth[i];
1106    }
1107
1108    if( uiCummulativeColumnWidth >= iWidthInCU )
1109    {
1110      printf( "The width of the column is too large.\n" );
1111      exit( EXIT_FAILURE );
1112    }
1113  }
1114
1115  //check the row relative parameters
1116  if( m_iNumRowsMinus1 >= (1<<(LOG2_MAX_NUM_ROWS_MINUS1+1)) )
1117  {
1118    printf( "The number of rows is larger than the maximum allowed number of rows.\n" );
1119    exit( EXIT_FAILURE );
1120  }
1121
1122  if( m_iNumRowsMinus1 >= iHeightInCU )
1123  {
1124    printf( "The current picture can not have so many rows.\n" );
1125    exit( EXIT_FAILURE );
1126  }
1127
1128  if( m_iNumRowsMinus1 && m_iUniformSpacingIdr==0 )
1129  {
1130    for(Int i=0; i<m_iNumRowsMinus1; i++)
1131      uiCummulativeRowHeight += m_puiRowHeight[i];
1132
1133    if( uiCummulativeRowHeight >= iHeightInCU )
1134    {
1135      printf( "The height of the row is too large.\n" );
1136      exit( EXIT_FAILURE );
1137    }
1138  }
1139}
1140#if H_MV
1141Void TEncTop::printSummary( Int numAllPicCoded )
1142{
1143  assert (numAllPicCoded == m_cAnalyzeAll.getNumPic());
1144
1145  //--CFG_KDY
1146  m_cAnalyzeAll.setFrmRate( getFrameRate() );
1147  m_cAnalyzeI.setFrmRate( getFrameRate() );
1148  m_cAnalyzeP.setFrmRate( getFrameRate() );
1149  m_cAnalyzeB.setFrmRate( getFrameRate() );
1150
1151  //-- all
1152  printf( "\n\nSUMMARY ------------------------------------------- LayerId %2d\n", m_layerId );
1153
1154  m_cAnalyzeAll.printOut('a');
1155
1156  printf( "\n\nI Slices--------------------------------------------------------\n" );
1157  m_cAnalyzeI.printOut('i');
1158
1159  printf( "\n\nP Slices--------------------------------------------------------\n" );
1160  m_cAnalyzeP.printOut('p');
1161
1162  printf( "\n\nB Slices--------------------------------------------------------\n" );
1163  m_cAnalyzeB.printOut('b');
1164
1165#if _SUMMARY_OUT_
1166  m_cAnalyzeAll.printSummaryOut();
1167#endif
1168#if _SUMMARY_PIC_
1169  m_cAnalyzeI.printSummary('I');
1170  m_cAnalyzeP.printSummary('P');
1171  m_cAnalyzeB.printSummary('B');
1172#endif
1173}
1174
1175Int TEncTop::getFrameId(Int iGOPid) 
1176{
1177  if(m_iPOCLast == 0)
1178  {
1179    return(0 );
1180  }
1181  else
1182  {
1183    return m_iPOCLast -m_iNumPicRcvd+ getGOPEntry(iGOPid).m_POC ;
1184  }
1185}
1186
1187TComPic* TEncTop::getPic( Int poc )
1188{
1189  TComList<TComPic*>* listPic = getListPic();
1190  TComPic* pcPic = NULL;
1191  for(TComList<TComPic*>::iterator it=listPic->begin(); it!=listPic->end(); it++)
1192  {
1193    if( (*it)->getPOC() == poc )
1194    {
1195      pcPic = *it ;
1196      break ;
1197    }
1198  }
1199  return pcPic;
1200}
1201#endif
1202
1203#if H_3D_VSO
1204Void TEncTop::setupRenModel( Int iPoc, Int iEncViewIdx, Int iEncContent, Int iHorOffset )
1205{
1206  TRenModel* rendererModel = m_cRdCost.getRenModel(); 
1207  rendererModel->setupPart( iHorOffset, std::min( (Int) g_uiMaxCUHeight, (Int) ( m_iSourceHeight - iHorOffset ) )) ; 
1208 
1209  Int iEncViewSIdx = m_cameraParameters->getBaseId2SortedId()[ iEncViewIdx ];
1210
1211  // setup base views
1212  Int iNumOfBV = m_renderModelParameters->getNumOfBaseViewsForView( iEncViewSIdx, iEncContent );
1213
1214  for (Int iCurView = 0; iCurView < iNumOfBV; iCurView++ )
1215  {
1216    Int iBaseViewSIdx;
1217    Int iVideoDistMode;
1218    Int iDepthDistMode;
1219
1220    m_renderModelParameters->getBaseViewData( iEncViewSIdx, iEncContent, iCurView, iBaseViewSIdx, iVideoDistMode, iDepthDistMode );
1221
1222    AOT( iVideoDistMode < 0 || iVideoDistMode > 2 );
1223
1224    Int iBaseViewIdx = m_cameraParameters->getBaseSortedId2Id()[ iBaseViewSIdx ];
1225
1226    TComPicYuv* pcPicYuvVideoRec  = m_ivPicLists->getPicYuv( iBaseViewIdx, false, iPoc, true  );
1227    TComPicYuv* pcPicYuvDepthRec  = m_ivPicLists->getPicYuv( iBaseViewIdx, true , iPoc, true  );
1228    TComPicYuv* pcPicYuvVideoOrg  = m_ivPicLists->getPicYuv( iBaseViewIdx, false, iPoc, false );
1229    TComPicYuv* pcPicYuvDepthOrg  = m_ivPicLists->getPicYuv( iBaseViewIdx, true , iPoc, false );   
1230
1231    TComPicYuv* pcPicYuvVideoRef  = ( iVideoDistMode == 2 ) ? pcPicYuvVideoOrg  : NULL;
1232    TComPicYuv* pcPicYuvDepthRef  = ( iDepthDistMode == 2 ) ? pcPicYuvDepthOrg  : NULL;
1233
1234    TComPicYuv* pcPicYuvVideoTest = ( iVideoDistMode == 0 ) ? pcPicYuvVideoOrg  : pcPicYuvVideoRec;
1235    TComPicYuv* pcPicYuvDepthTest = ( iDepthDistMode == 0 ) ? pcPicYuvDepthOrg  : pcPicYuvDepthRec;
1236
1237    AOT( (iVideoDistMode == 2) != (pcPicYuvVideoRef != NULL) );
1238    AOT( (iDepthDistMode == 2) != (pcPicYuvDepthRef != NULL) );
1239    AOT( pcPicYuvDepthTest == NULL );
1240    AOT( pcPicYuvVideoTest == NULL );
1241
1242    rendererModel->setBaseView( iBaseViewSIdx, pcPicYuvVideoTest, pcPicYuvDepthTest, pcPicYuvVideoRef, pcPicYuvDepthRef );
1243  }
1244
1245  rendererModel->setErrorMode( iEncViewSIdx, iEncContent, 0 );
1246  // setup virtual views
1247  Int iNumOfSV  = m_renderModelParameters->getNumOfModelsForView( iEncViewSIdx, iEncContent );
1248  for (Int iCurView = 0; iCurView < iNumOfSV; iCurView++ )
1249  {
1250    Int iOrgRefBaseViewSIdx;
1251    Int iLeftBaseViewSIdx;
1252    Int iRightBaseViewSIdx;
1253    Int iSynthViewRelNum;
1254    Int iModelNum;
1255    Int iBlendMode;
1256    m_renderModelParameters->getSingleModelData(iEncViewSIdx, iEncContent, iCurView, iModelNum, iBlendMode,iLeftBaseViewSIdx, iRightBaseViewSIdx, iOrgRefBaseViewSIdx, iSynthViewRelNum );
1257
1258    Int iLeftBaseViewIdx    = -1;
1259    Int iRightBaseViewIdx   = -1;
1260
1261    TComPicYuv* pcPicYuvOrgRef  = NULL;
1262    Int**      ppiShiftLUTLeft  = NULL;
1263    Int**      ppiShiftLUTRight = NULL;
1264    Int**      ppiBaseShiftLUTLeft  = NULL;
1265    Int**      ppiBaseShiftLUTRight = NULL;
1266
1267
1268    Int        iDistToLeft      = -1;
1269
1270    Int iSynthViewIdx = m_cameraParameters->synthRelNum2Idx( iSynthViewRelNum );
1271
1272    if ( iLeftBaseViewSIdx != -1 )
1273    {
1274      iLeftBaseViewIdx   = m_cameraParameters->getBaseSortedId2Id()   [ iLeftBaseViewSIdx ];
1275      ppiShiftLUTLeft    = m_cameraParameters->getSynthViewShiftLUTI()[ iLeftBaseViewIdx  ][ iSynthViewIdx  ];
1276    }
1277
1278    if ( iRightBaseViewSIdx != -1 )
1279    {
1280      iRightBaseViewIdx  = m_cameraParameters->getBaseSortedId2Id()   [iRightBaseViewSIdx ];
1281      ppiShiftLUTRight   = m_cameraParameters->getSynthViewShiftLUTI()[ iRightBaseViewIdx ][ iSynthViewIdx ];
1282    }
1283
1284    if ( iRightBaseViewSIdx != -1 && iLeftBaseViewSIdx != -1 )
1285    {
1286      iDistToLeft          = m_cameraParameters->getRelDistLeft(  iSynthViewIdx , iLeftBaseViewIdx, iRightBaseViewIdx);
1287      ppiBaseShiftLUTLeft  = m_cameraParameters->getBaseViewShiftLUTI() [ iLeftBaseViewIdx  ][ iRightBaseViewIdx ];
1288      ppiBaseShiftLUTRight = m_cameraParameters->getBaseViewShiftLUTI() [ iRightBaseViewIdx ][ iLeftBaseViewIdx  ];
1289
1290    }
1291
1292    if ( iOrgRefBaseViewSIdx != -1 )
1293    {
1294      pcPicYuvOrgRef = m_ivPicLists->getPicYuv(  m_cameraParameters->getBaseSortedId2Id()[ iOrgRefBaseViewSIdx ] , false, iPoc, false );
1295      AOF ( pcPicYuvOrgRef );
1296    }
1297
1298    rendererModel->setSingleModel( iModelNum, ppiShiftLUTLeft, ppiBaseShiftLUTLeft, ppiShiftLUTRight, ppiBaseShiftLUTRight, iDistToLeft, pcPicYuvOrgRef );
1299  }
1300}
1301#endif
1302//! \}
Note: See TracBrowser for help on using the repository browser.