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

Last change on this file since 1353 was 1350, checked in by seregin, 9 years ago

port rev 4428

  • Property svn:eol-style set to native
File size: 59.4 KB
Line 
1/* The copyright in this software is being made available under the BSD
2 * License, included below. This software may be subject to other third party
3 * and contributor rights, including patent rights, and no such rights are
4 * granted under this license.
5 *
6 * Copyright (c) 2010-2015, 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#include "TLibCommon/TComChromaFormat.h"
42#if FAST_BIT_EST
43#include "TLibCommon/ContextModel.h"
44#endif
45
46//! \ingroup TLibEncoder
47//! \{
48#if SVC_EXTENSION 
49Int TEncTop::m_iSPSIdCnt = 0;
50Int TEncTop::m_iPPSIdCnt = 0;
51TComVPS TEncCfg::m_cVPS;
52#endif
53
54// ====================================================================================================================
55// Constructor / destructor / create / destroy
56// ====================================================================================================================
57
58TEncTop::TEncTop()
59{
60  m_iPOCLast          = -1;
61  m_iNumPicRcvd       =  0;
62  m_uiNumAllPicCoded  =  0;
63  m_pppcRDSbacCoder   =  NULL;
64  m_pppcBinCoderCABAC =  NULL;
65  m_cRDGoOnSbacCoder.init( &m_cRDGoOnBinCoderCABAC );
66#if ENC_DEC_TRACE
67  if (g_hTrace == NULL)
68  {
69    g_hTrace = fopen( "TraceEnc.txt", "wb" );
70  }
71  g_bJustDoIt = g_bEncDecTraceDisable;
72  g_nSymbolCounter = 0;
73#endif
74
75  m_iMaxRefPicNum     = 0;
76
77#if FAST_BIT_EST
78  ContextModel::buildNextStateTable();
79#endif
80
81#if SVC_EXTENSION
82  memset( m_cIlpPic, 0, sizeof(m_cIlpPic) );
83  m_bMFMEnabledFlag = false;
84  m_numRefLayerLocationOffsets = 0;
85  m_pocAdjustmentValue     = 0;
86#if NO_CLRAS_OUTPUT_FLAG
87  m_noClrasOutputFlag          = false;
88  m_layerInitializedFlag       = false;
89  m_firstPicInLayerDecodedFlag = false;
90  m_noOutputOfPriorPicsFlags   = false;
91#endif
92  m_pocDecrementedInDPBFlag    = false;
93#endif //SVC_EXTENSION
94}
95
96TEncTop::~TEncTop()
97{
98#if ENC_DEC_TRACE
99  if (g_hTrace != stdout)
100  {
101    fclose( g_hTrace );
102  }
103#endif
104}
105
106Void TEncTop::create ()
107{
108#if !SVC_EXTENSION
109  // initialize global variables
110  initROM();
111#endif
112
113  // create processing unit classes
114#if SVC_EXTENSION
115  m_cGOPEncoder.        create( m_layerId );
116#else
117  m_cGOPEncoder.        create( );
118#endif
119  m_cSliceEncoder.      create( getSourceWidth(), getSourceHeight(), m_chromaFormatIDC, m_maxCUWidth, m_maxCUHeight, m_maxTotalCUDepth );
120  m_cCuEncoder.         create( m_maxTotalCUDepth, m_maxCUWidth, m_maxCUHeight, m_chromaFormatIDC );
121  if (m_bUseSAO)
122  {
123    m_cEncSAO.create( getSourceWidth(), getSourceHeight(), m_chromaFormatIDC, m_maxCUWidth, m_maxCUHeight, m_maxTotalCUDepth, m_log2SaoOffsetScale[CHANNEL_TYPE_LUMA], m_log2SaoOffsetScale[CHANNEL_TYPE_CHROMA] );
124    m_cEncSAO.createEncData(getSaoCtuBoundary());
125  }
126#if ADAPTIVE_QP_SELECTION
127  if (m_bUseAdaptQpSelect)
128  {
129    m_cTrQuant.initSliceQpDelta();
130  }
131#endif
132
133  m_cLoopFilter.create( m_maxTotalCUDepth );
134
135  if ( m_RCEnableRateControl )
136  {
137    m_cRateCtrl.init( m_framesToBeEncoded, m_RCTargetBitrate, m_iFrameRate, m_iGOPSize, m_iSourceWidth, m_iSourceHeight,
138        m_maxCUWidth, m_maxCUHeight, m_RCKeepHierarchicalBit, m_RCUseLCUSeparateModel, m_GOPList );
139  }
140
141  m_pppcRDSbacCoder = new TEncSbac** [m_maxTotalCUDepth+1];
142#if FAST_BIT_EST
143  m_pppcBinCoderCABAC = new TEncBinCABACCounter** [m_maxTotalCUDepth+1];
144#else
145  m_pppcBinCoderCABAC = new TEncBinCABAC** [m_maxTotalCUDepth+1];
146#endif
147
148  for ( Int iDepth = 0; iDepth < m_maxTotalCUDepth+1; iDepth++ )
149  {
150    m_pppcRDSbacCoder[iDepth] = new TEncSbac* [CI_NUM];
151#if FAST_BIT_EST
152    m_pppcBinCoderCABAC[iDepth] = new TEncBinCABACCounter* [CI_NUM];
153#else
154    m_pppcBinCoderCABAC[iDepth] = new TEncBinCABAC* [CI_NUM];
155#endif
156
157    for (Int iCIIdx = 0; iCIIdx < CI_NUM; iCIIdx ++ )
158    {
159      m_pppcRDSbacCoder[iDepth][iCIIdx] = new TEncSbac;
160#if FAST_BIT_EST
161      m_pppcBinCoderCABAC [iDepth][iCIIdx] = new TEncBinCABACCounter;
162#else
163      m_pppcBinCoderCABAC [iDepth][iCIIdx] = new TEncBinCABAC;
164#endif
165      m_pppcRDSbacCoder   [iDepth][iCIIdx]->init( m_pppcBinCoderCABAC [iDepth][iCIIdx] );
166    }
167  }
168
169#if LAYER_CTB
170  memcpy(g_auiLayerZscanToRaster[m_layerId], g_auiZscanToRaster, sizeof( g_auiZscanToRaster ) );
171  memcpy(g_auiLayerRasterToZscan[m_layerId], g_auiRasterToZscan, sizeof( g_auiRasterToZscan ) );
172  memcpy(g_auiLayerRasterToPelX[m_layerId],  g_auiRasterToPelX,  sizeof( g_auiRasterToPelX ) );
173  memcpy(g_auiLayerRasterToPelY[m_layerId],  g_auiRasterToPelY,  sizeof( g_auiRasterToPelY ) );
174#endif
175}
176
177Void TEncTop::destroy ()
178{
179  // destroy processing unit classes
180  m_cGOPEncoder.        destroy();
181  m_cSliceEncoder.      destroy();
182  m_cCuEncoder.         destroy();
183  m_cEncSAO.            destroyEncData();
184  m_cEncSAO.            destroy();
185  m_cLoopFilter.        destroy();
186  m_cRateCtrl.          destroy();
187  Int iDepth;
188  for ( iDepth = 0; iDepth < m_maxTotalCUDepth+1; iDepth++ )
189  {
190    for (Int iCIIdx = 0; iCIIdx < CI_NUM; iCIIdx ++ )
191    {
192      delete m_pppcRDSbacCoder[iDepth][iCIIdx];
193      delete m_pppcBinCoderCABAC[iDepth][iCIIdx];
194    }
195  }
196
197  for ( iDepth = 0; iDepth < m_maxTotalCUDepth+1; iDepth++ )
198  {
199    delete [] m_pppcRDSbacCoder[iDepth];
200    delete [] m_pppcBinCoderCABAC[iDepth];
201  }
202
203  delete [] m_pppcRDSbacCoder;
204  delete [] m_pppcBinCoderCABAC;
205 
206#if SVC_EXTENSION
207  for(Int i=0; i<MAX_NUM_REF; i++)
208  {
209    if(m_cIlpPic[i])
210    {
211      m_cIlpPic[i]->destroy();
212      delete m_cIlpPic[i];
213      m_cIlpPic[i] = NULL;
214    }
215  }
216#else
217  // destroy ROM
218  destroyROM();
219#endif
220  return;
221}
222
223Void TEncTop::init(Bool isFieldCoding)
224{
225  // initialize SPS
226  xInitSPS();
227  xInitVPS();
228
229  m_cRdCost.setCostMode(m_costMode);
230
231  // initialize PPS
232  xInitPPS();
233  xInitRPS(isFieldCoding);
234
235  xInitPPSforTiles();
236
237  // initialize processing unit classes
238  m_cGOPEncoder.  init( this );
239  m_cSliceEncoder.init( this );
240  m_cCuEncoder.   init( this );
241
242  // initialize transform & quantization class
243  m_pcCavlcCoder = getCavlcCoder();
244
245  m_cTrQuant.init( 1 << m_uiQuadtreeTULog2MaxSize,
246                   m_useRDOQ,
247                   m_useRDOQTS,
248#if T0196_SELECTIVE_RDOQ
249                   m_useSelectiveRDOQ,
250#endif
251                   true
252                  ,m_useTransformSkipFast
253#if ADAPTIVE_QP_SELECTION
254                  ,m_bUseAdaptQpSelect
255#endif
256                  );
257
258  // initialize encoder search class
259  m_cSearch.init( this, &m_cTrQuant, m_iSearchRange, m_bipredSearchRange, m_iFastSearch, m_maxCUWidth, m_maxCUHeight, m_maxTotalCUDepth, &m_cEntropyCoder, &m_cRdCost, getRDSbacCoder(), getRDGoOnSbacCoder() );
260
261  m_iMaxRefPicNum = 0;
262
263  xInitScalingLists();
264
265#if SVC_EXTENSION
266  m_iSPSIdCnt ++;
267  m_iPPSIdCnt ++;
268  xInitILRP();
269#endif
270}
271
272Void TEncTop::xInitScalingLists()
273{
274  // Initialise scaling lists
275  // The encoder will only use the SPS scaling lists. The PPS will never be marked present.
276  const Int maxLog2TrDynamicRange[MAX_NUM_CHANNEL_TYPE] =
277  {
278      m_cSPS.getMaxLog2TrDynamicRange(CHANNEL_TYPE_LUMA),
279      m_cSPS.getMaxLog2TrDynamicRange(CHANNEL_TYPE_CHROMA)
280  };
281  if(getUseScalingListId() == SCALING_LIST_OFF)
282  {
283#if SVC_EXTENSION
284    getTrQuant()->setFlatScalingList( maxLog2TrDynamicRange, m_cVPS.getBitDepths(&m_cSPS, m_layerId) );
285#else
286    getTrQuant()->setFlatScalingList(maxLog2TrDynamicRange, m_cSPS.getBitDepths());
287#endif
288    getTrQuant()->setUseScalingList(false);
289    m_cSPS.setScalingListPresentFlag(false);
290    m_cPPS.setScalingListPresentFlag(false);
291  }
292  else if(getUseScalingListId() == SCALING_LIST_DEFAULT)
293  {
294#if SVC_EXTENSION
295    // inferring of the scaling list can be moved to the config file
296    UInt refLayerId = 0;
297    if( m_layerId > 0 && !m_cVPS.getNonHEVCBaseLayerFlag() && m_cVPS.getRecursiveRefLayerFlag( m_layerId, refLayerId ) )
298    {
299      m_cSPS.setInferScalingListFlag( true );
300      m_cSPS.setScalingListRefLayerId( refLayerId );
301      m_cSPS.setScalingListPresentFlag( false );
302      m_cPPS.setInferScalingListFlag( false );
303      m_cPPS.setScalingListPresentFlag( false );
304
305      // infer the scaling list from the reference layer
306      getTrQuant()->setScalingList( &m_ppcTEncTop[m_cVPS.getLayerIdxInVps(refLayerId)]->getSPS()->getScalingList(), maxLog2TrDynamicRange, m_cVPS.getBitDepths(&m_cSPS, m_layerId) );
307    }
308    else
309    {
310#endif
311    m_cSPS.getScalingList().setDefaultScalingList ();
312    m_cSPS.setScalingListPresentFlag(false);
313    m_cPPS.setScalingListPresentFlag(false);
314
315#if SVC_EXTENSION
316    getTrQuant()->setScalingList(&(m_cSPS.getScalingList()), maxLog2TrDynamicRange, m_cVPS.getBitDepths(&m_cSPS, m_layerId));
317#else
318    getTrQuant()->setScalingList(&(m_cSPS.getScalingList()), maxLog2TrDynamicRange, m_cSPS.getBitDepths());
319#endif
320#if SVC_EXTENSION
321    }
322#endif
323    getTrQuant()->setUseScalingList(true);
324  }
325  else if(getUseScalingListId() == SCALING_LIST_FILE_READ)
326  {
327#if SVC_EXTENSION
328    // inferring of the scaling list can be moved to the config file
329    UInt refLayerId = 0;
330    if( m_layerId > 0 && !m_cVPS.getNonHEVCBaseLayerFlag() && m_cVPS.getRecursiveRefLayerFlag( m_layerId, refLayerId ) )
331    {
332      m_cSPS.setInferScalingListFlag( true );
333      m_cSPS.setScalingListRefLayerId( refLayerId );
334      m_cSPS.setScalingListPresentFlag( false );
335      m_cPPS.setInferScalingListFlag( false );
336      m_cPPS.setScalingListPresentFlag( false );
337
338      // infer the scaling list from the reference layer
339      getTrQuant()->setScalingList( &m_ppcTEncTop[m_cVPS.getLayerIdxInVps(refLayerId)]->getSPS()->getScalingList(), maxLog2TrDynamicRange, m_cVPS.getBitDepths(&m_cSPS, m_layerId) );
340    }
341    else
342    {
343#endif
344    m_cSPS.getScalingList().setDefaultScalingList ();
345    if(m_cSPS.getScalingList().xParseScalingList(getScalingListFile()))
346    {
347      Bool bParsedScalingList=false; // Use of boolean so that assertion outputs useful string
348      assert(bParsedScalingList);
349      exit(1);
350    }
351    m_cSPS.getScalingList().checkDcOfMatrix();
352    m_cSPS.setScalingListPresentFlag(m_cSPS.getScalingList().checkDefaultScalingList());
353    m_cPPS.setScalingListPresentFlag(false);
354    getTrQuant()->setScalingList(&(m_cSPS.getScalingList()), maxLog2TrDynamicRange, m_cSPS.getBitDepths());
355#if SVC_EXTENSION
356    }
357#endif
358    getTrQuant()->setUseScalingList(true);
359  }
360  else
361  {
362    printf("error : ScalingList == %d not supported\n",getUseScalingListId());
363    assert(0);
364  }
365
366  if (getUseScalingListId() != SCALING_LIST_OFF)
367  {
368    // Prepare delta's:
369    for(UInt sizeId = 0; sizeId < SCALING_LIST_SIZE_NUM; sizeId++)
370    {
371      const Int predListStep = (sizeId == SCALING_LIST_32x32? (SCALING_LIST_NUM/NUMBER_OF_PREDICTION_MODES) : 1); // if 32x32, skip over chroma entries.
372
373      for(UInt listId = 0; listId < SCALING_LIST_NUM; listId+=predListStep)
374      {
375        m_cSPS.getScalingList().checkPredMode( sizeId, listId );
376      }
377    }
378  }
379}
380
381// ====================================================================================================================
382// Public member functions
383// ====================================================================================================================
384
385Void TEncTop::deletePicBuffer()
386{
387  TComList<TComPic*>::iterator iterPic = m_cListPic.begin();
388  Int iSize = Int( m_cListPic.size() );
389
390  for ( Int i = 0; i < iSize; i++ )
391  {
392    TComPic* pcPic = *(iterPic++);
393
394    pcPic->destroy();
395    delete pcPic;
396    pcPic = NULL;
397  }
398}
399
400/**
401 - Application has picture buffer list with size of GOP + 1
402 - Picture buffer list acts like as ring buffer
403 - End of the list has the latest picture
404 .
405 \param   flush               cause encoder to encode a partial GOP
406 \param   pcPicYuvOrg         original YUV picture
407 \param   pcPicYuvTrueOrg     
408 \param   snrCSC
409 \retval  rcListPicYuvRecOut  list of reconstruction YUV pictures
410 \retval  accessUnitsOut      list of output access units
411 \retval  iNumEncoded         number of encoded pictures
412 */
413#if SVC_EXTENSION
414Void TEncTop::encode( TComPicYuv* pcPicYuvOrg, const InputColourSpaceConversion snrCSC, TComList<TComPicYuv*>& rcListPicYuvRecOut, std::list<AccessUnit>& accessUnitsOut, Int iPicIdInGOP )
415{
416  // compress GOP
417#if !RC_SHVC_HARMONIZATION
418  if ( m_RCEnableRateControl )
419  {
420    m_cRateCtrl.initRCGOP( m_iNumPicRcvd );
421  }
422#endif
423
424  // compress GOP
425  m_cGOPEncoder.compressGOP(iPicIdInGOP, m_iPOCLast, m_iNumPicRcvd, m_cListPic, rcListPicYuvRecOut, accessUnitsOut, false, false, snrCSC, m_printFrameMSE);
426
427#if !RC_SHVC_HARMONIZATION
428  if ( m_RCEnableRateControl )
429  {
430    m_cRateCtrl.destroyRCGOP();
431  }
432#endif
433 
434  m_uiNumAllPicCoded ++;
435}
436
437Void TEncTop::encodePrep( TComPicYuv* pcPicYuvOrg, TComPicYuv* pcPicYuvTrueOrg )
438{
439  if (pcPicYuvOrg != NULL)
440  {
441    // get original YUV
442    TComPic* pcPicCurr = NULL;
443    xGetNewPicBuffer( pcPicCurr );
444    pcPicYuvOrg->copyToPic( pcPicCurr->getPicYuvOrg() );
445    pcPicYuvTrueOrg->copyToPic( pcPicCurr->getPicYuvTrueOrg() );
446
447    // compute image characteristics
448    if ( getUseAdaptiveQP() )
449    {
450      m_cPreanalyzer.xPreanalyze( dynamic_cast<TEncPic*>( pcPicCurr ) );
451    }
452  }
453}
454#else
455Void TEncTop::encode( Bool flush, TComPicYuv* pcPicYuvOrg, TComPicYuv* pcPicYuvTrueOrg, const InputColourSpaceConversion snrCSC, TComList<TComPicYuv*>& rcListPicYuvRecOut, std::list<AccessUnit>& accessUnitsOut, Int& iNumEncoded )
456{
457  if (pcPicYuvOrg != NULL)
458  {
459    // get original YUV
460    TComPic* pcPicCurr = NULL;
461
462    xGetNewPicBuffer( pcPicCurr );
463    pcPicYuvOrg->copyToPic( pcPicCurr->getPicYuvOrg() );
464    pcPicYuvTrueOrg->copyToPic( pcPicCurr->getPicYuvTrueOrg() );
465
466    // compute image characteristics
467    if ( getUseAdaptiveQP() )
468    {
469      m_cPreanalyzer.xPreanalyze( dynamic_cast<TEncPic*>( pcPicCurr ) );
470    }
471  }
472
473  if ((m_iNumPicRcvd == 0) || (!flush && (m_iPOCLast != 0) && (m_iNumPicRcvd != m_iGOPSize) && (m_iGOPSize != 0)))
474  {
475    iNumEncoded = 0;
476    return;
477  }
478
479  if ( m_RCEnableRateControl )
480  {
481    m_cRateCtrl.initRCGOP( m_iNumPicRcvd );
482  }
483
484  // compress GOP
485  m_cGOPEncoder.compressGOP(m_iPOCLast, m_iNumPicRcvd, m_cListPic, rcListPicYuvRecOut, accessUnitsOut, false, false, snrCSC, m_printFrameMSE);
486
487  if ( m_RCEnableRateControl )
488  {
489    m_cRateCtrl.destroyRCGOP();
490  }
491
492  iNumEncoded         = m_iNumPicRcvd;
493  m_iNumPicRcvd       = 0;
494  m_uiNumAllPicCoded += iNumEncoded;
495}
496#endif
497
498/**------------------------------------------------
499 Separate interlaced frame into two fields
500 -------------------------------------------------**/
501Void separateFields(Pel* org, Pel* dstField, UInt stride, UInt width, UInt height, Bool isTop)
502{
503  if (!isTop)
504  {
505    org += stride;
506  }
507  for (Int y = 0; y < height>>1; y++)
508  {
509    for (Int x = 0; x < width; x++)
510    {
511      dstField[x] = org[x];
512    }
513
514    dstField += stride;
515    org += stride*2;
516  }
517
518}
519
520#if SVC_EXTENSION
521Void TEncTop::encodePrep( TComPicYuv* pcPicYuvOrg, TComPicYuv* pcPicYuvTrueOrg, Bool isTff )
522{
523  for (Int fieldNum=0; fieldNum<2; fieldNum++)
524  {
525    if (pcPicYuvOrg)
526    {
527      /* -- field initialization -- */
528      const Bool isTopField=isTff==(fieldNum==0);
529
530      TComPic *pcField;
531      xGetNewPicBuffer( pcField );
532      pcField->setReconMark (false);                     // where is this normally?
533           
534      pcField->getSlice(0)->setPOC( m_iPOCLast );        // superfluous?
535      pcField->getPicYuvRec()->setBorderExtension(false);// where is this normally?
536
537      pcField->setTopField(isTopField);                  // interlaced requirement
538
539      for (UInt componentIndex = 0; componentIndex < pcPicYuvOrg->getNumberValidComponents(); componentIndex++)
540      {
541        const ComponentID component = ComponentID(componentIndex);
542        const UInt stride = pcPicYuvOrg->getStride(component);
543
544        separateFields((pcPicYuvOrg->getBuf(component) + pcPicYuvOrg->getMarginX(component) + (pcPicYuvOrg->getMarginY(component) * stride)),
545                       pcField->getPicYuvOrg()->getAddr(component),
546                       pcPicYuvOrg->getStride(component),
547                       pcPicYuvOrg->getWidth(component),
548                       pcPicYuvOrg->getHeight(component),
549                       isTopField);
550
551        separateFields((pcPicYuvTrueOrg->getBuf(component) + pcPicYuvTrueOrg->getMarginX(component) + (pcPicYuvTrueOrg->getMarginY(component) * stride)),
552                       pcField->getPicYuvTrueOrg()->getAddr(component),
553                       pcPicYuvTrueOrg->getStride(component),
554                       pcPicYuvTrueOrg->getWidth(component),
555                       pcPicYuvTrueOrg->getHeight(component),
556                       isTopField);
557      }
558
559      // compute image characteristics
560      if ( getUseAdaptiveQP() )
561      {
562        m_cPreanalyzer.xPreanalyze( dynamic_cast<TEncPic*>( pcField ) );
563      }
564    }
565  }
566}
567
568Void TEncTop::encode( TComPicYuv* pcPicYuvOrg, const InputColourSpaceConversion snrCSC, TComList<TComPicYuv*>& rcListPicYuvRecOut, std::list<AccessUnit>& accessUnitsOut, Int iPicIdInGOP, Bool isTff )
569{
570  for (Int fieldNum=0; fieldNum<2; fieldNum++)
571  {
572    if (pcPicYuvOrg)
573    {
574      if (fieldNum==1)                                   // where is this normally?
575      {
576        TComPicYuv* rpcPicYuvRec;
577
578        // org. buffer
579        if ( rcListPicYuvRecOut.size() >= (UInt)m_iGOPSize+1 ) // need to maintain field 0 in list of RecOuts while processing field 1. Hence +1 on m_iGOPSize.
580        {
581          rpcPicYuvRec = rcListPicYuvRecOut.popFront();
582        }
583        else
584        {
585          rpcPicYuvRec = new TComPicYuv;
586          rpcPicYuvRec->create( m_iSourceWidth, m_iSourceHeight, m_chromaFormatIDC, m_maxCUWidth, m_maxCUHeight, m_maxTotalCUDepth, true);
587        }
588        rcListPicYuvRecOut.pushBack( rpcPicYuvRec );
589      }
590    }
591
592    // compress GOP
593    m_cGOPEncoder.compressGOP(iPicIdInGOP, m_iPOCLast, m_iNumPicRcvd, m_cListPic, rcListPicYuvRecOut, accessUnitsOut, true, isTff, snrCSC, m_printFrameMSE);
594  }
595
596  m_uiNumAllPicCoded ++;
597}
598#else
599Void TEncTop::encode(Bool flush, TComPicYuv* pcPicYuvOrg, TComPicYuv* pcPicYuvTrueOrg, const InputColourSpaceConversion snrCSC, TComList<TComPicYuv*>& rcListPicYuvRecOut, std::list<AccessUnit>& accessUnitsOut, Int& iNumEncoded, Bool isTff)
600{
601  iNumEncoded = 0;
602
603  for (Int fieldNum=0; fieldNum<2; fieldNum++)
604  {
605    if (pcPicYuvOrg)
606    {
607
608      /* -- field initialization -- */
609      const Bool isTopField=isTff==(fieldNum==0);
610
611      TComPic *pcField;
612      xGetNewPicBuffer( pcField );
613      pcField->setReconMark (false);                     // where is this normally?
614
615      if (fieldNum==1)                                   // where is this normally?
616      {
617        TComPicYuv* rpcPicYuvRec;
618
619        // org. buffer
620        if ( rcListPicYuvRecOut.size() >= (UInt)m_iGOPSize+1 ) // need to maintain field 0 in list of RecOuts while processing field 1. Hence +1 on m_iGOPSize.
621        {
622          rpcPicYuvRec = rcListPicYuvRecOut.popFront();
623        }
624        else
625        {
626          rpcPicYuvRec = new TComPicYuv;
627          rpcPicYuvRec->create( m_iSourceWidth, m_iSourceHeight, m_chromaFormatIDC, m_maxCUWidth, m_maxCUHeight, m_maxTotalCUDepth, true);
628        }
629        rcListPicYuvRecOut.pushBack( rpcPicYuvRec );
630      }
631
632      pcField->getSlice(0)->setPOC( m_iPOCLast );        // superfluous?
633      pcField->getPicYuvRec()->setBorderExtension(false);// where is this normally?
634
635      pcField->setTopField(isTopField);                  // interlaced requirement
636
637      for (UInt componentIndex = 0; componentIndex < pcPicYuvOrg->getNumberValidComponents(); componentIndex++)
638      {
639        const ComponentID component = ComponentID(componentIndex);
640        const UInt stride = pcPicYuvOrg->getStride(component);
641
642        separateFields((pcPicYuvOrg->getBuf(component) + pcPicYuvOrg->getMarginX(component) + (pcPicYuvOrg->getMarginY(component) * stride)),
643                       pcField->getPicYuvOrg()->getAddr(component),
644                       pcPicYuvOrg->getStride(component),
645                       pcPicYuvOrg->getWidth(component),
646                       pcPicYuvOrg->getHeight(component),
647                       isTopField);
648
649        separateFields((pcPicYuvTrueOrg->getBuf(component) + pcPicYuvTrueOrg->getMarginX(component) + (pcPicYuvTrueOrg->getMarginY(component) * stride)),
650                       pcField->getPicYuvTrueOrg()->getAddr(component),
651                       pcPicYuvTrueOrg->getStride(component),
652                       pcPicYuvTrueOrg->getWidth(component),
653                       pcPicYuvTrueOrg->getHeight(component),
654                       isTopField);
655      }
656
657      // compute image characteristics
658      if ( getUseAdaptiveQP() )
659      {
660        m_cPreanalyzer.xPreanalyze( dynamic_cast<TEncPic*>( pcField ) );
661      }
662    }
663
664    if ( m_iNumPicRcvd && ((flush&&fieldNum==1) || (m_iPOCLast/2)==0 || m_iNumPicRcvd==m_iGOPSize ) )
665    {
666      // compress GOP
667      m_cGOPEncoder.compressGOP(m_iPOCLast, m_iNumPicRcvd, m_cListPic, rcListPicYuvRecOut, accessUnitsOut, true, isTff, snrCSC, m_printFrameMSE);
668
669      iNumEncoded += m_iNumPicRcvd;
670      m_uiNumAllPicCoded += m_iNumPicRcvd;
671      m_iNumPicRcvd = 0;
672    }
673  }
674}
675#endif
676
677// ====================================================================================================================
678// Protected member functions
679// ====================================================================================================================
680
681/**
682 - Application has picture buffer list with size of GOP + 1
683 - Picture buffer list acts like as ring buffer
684 - End of the list has the latest picture
685 .
686 \retval rpcPic obtained picture buffer
687 */
688Void TEncTop::xGetNewPicBuffer ( TComPic*& rpcPic )
689{
690  // At this point, the SPS and PPS can be considered activated - they are copied to the new TComPic.
691
692  TComSlice::sortPicList(m_cListPic);
693
694
695  if (m_cListPic.size() >= (UInt)(m_iGOPSize + getMaxDecPicBuffering(MAX_TLAYER-1) + 2) )
696  {
697    TComList<TComPic*>::iterator iterPic  = m_cListPic.begin();
698    Int iSize = Int( m_cListPic.size() );
699    for ( Int i = 0; i < iSize; i++ )
700    {
701      rpcPic = *(iterPic++);
702      if(rpcPic->getSlice(0)->isReferenced() == false)
703      {
704        break;
705      }
706    }
707  }
708  else
709  {
710    if ( getUseAdaptiveQP() )
711    {
712      TEncPic* pcEPic = new TEncPic;
713
714#if SVC_EXTENSION //Temporal solution, should be modified
715      if( m_layerId > 0 )
716      {
717        for( UInt i = 0; i < m_cVPS.getNumDirectRefLayers( m_layerId ); i++ )
718        {
719          const Window scalEL = m_cPPS.getScaledRefLayerWindowForLayer(m_cVPS.getRefLayerId(m_layerId, i));
720          const Window altRL = m_cPPS.getRefLayerWindowForLayer(m_cVPS.getRefLayerId(m_layerId, i));
721          Bool equalOffsets = scalEL.hasEqualOffset(altRL);
722          Bool zeroPhase = m_cPPS.hasZeroResamplingPhase(m_cVPS.getRefLayerId(m_layerId, i));
723
724          TEncTop *pcEncTopBase = (TEncTop *)getRefLayerEnc( i );
725
726          UInt refLayerId = m_cVPS.getRefLayerId(m_layerId, i);
727
728          const Int bitDepthLuma = m_cVPS.getBitDepth(CHANNEL_TYPE_LUMA, &m_cSPS, m_layerId);
729          const Int bitDepthChroma = m_cVPS.getBitDepth(CHANNEL_TYPE_CHROMA, &m_cSPS, m_layerId);
730          const Int refBitDepthLuma = m_cVPS.getBitDepth(CHANNEL_TYPE_LUMA, pcEncTopBase->getSPS(), refLayerId);
731          const Int refBitDepthChroma = m_cVPS.getBitDepth(CHANNEL_TYPE_CHROMA, pcEncTopBase->getSPS(), refLayerId);
732
733          Bool sameBitDepths = ( bitDepthLuma == refBitDepthLuma ) && ( bitDepthChroma == refBitDepthChroma );
734
735          if( m_iSourceWidth == pcEncTopBase->getSourceWidth() && m_iSourceHeight == pcEncTopBase->getSourceHeight() && equalOffsets && zeroPhase )
736          {
737            pcEPic->setEqualPictureSizeAndOffsetFlag( i, true );
738          }
739
740          if( !pcEPic->equalPictureSizeAndOffsetFlag(i) || !sameBitDepths
741#if CGS_3D_ASYMLUT
742            || m_cPPS.getCGSFlag() > 0
743#endif
744#if LAYER_CTB
745            || pcEncTopBase->getSPS()->getMaxCUWidth() != m_cSPS.getMaxCUWidth() || pcEncTopBase->getSPS()->getMaxCUHeight() != m_cSPS.getMaxCUHeight() || pcEncTopBase->getSPS()->getMaxCUDepth() != m_cSPS.getMaxCUDepth()
746#endif
747            )
748          {
749            pcEPic->setSpatialEnhLayerFlag( i, true );
750
751            //only for scalable extension
752            assert( m_cVPS.getScalabilityMask( SCALABILITY_ID ) == true );
753          }
754        }
755      }
756
757      pcEPic->create( m_cVPS, m_cSPS, m_cPPS, m_cPPS.getMaxCuDQPDepth()+1, false, m_layerId);
758#else  //SVC_EXTENSION
759      pcEPic->create( m_cSPS, m_cPPS, m_cPPS.getMaxCuDQPDepth()+1, false);
760#endif //SVC_EXTENSION
761      rpcPic = pcEPic;
762    }
763    else
764    {
765      rpcPic = new TComPic;
766
767#if SVC_EXTENSION //Temporal solution, should be modified
768      if( m_layerId > 0 )
769      {
770        for( UInt i = 0; i < m_cVPS.getNumDirectRefLayers( m_layerId ); i++ )
771        {
772          const Window scalEL = m_cPPS.getScaledRefLayerWindowForLayer(m_cVPS.getRefLayerId(m_layerId, i));
773          const Window altRL = m_cPPS.getRefLayerWindowForLayer(m_cVPS.getRefLayerId(m_layerId, i));
774          Bool equalOffsets = scalEL.hasEqualOffset(altRL);
775          Bool zeroPhase = m_cPPS.hasZeroResamplingPhase(m_cVPS.getRefLayerId(m_layerId, i));
776
777          TEncTop *pcEncTopBase = (TEncTop *)getRefLayerEnc( i );
778
779          UInt refLayerId = m_cVPS.getRefLayerId(m_layerId, i);
780
781          const Int bitDepthLuma = m_cVPS.getBitDepth(CHANNEL_TYPE_LUMA, &m_cSPS, m_layerId);
782          const Int bitDepthChroma = m_cVPS.getBitDepth(CHANNEL_TYPE_CHROMA, &m_cSPS, m_layerId);
783          const Int refBitDepthLuma = m_cVPS.getBitDepth(CHANNEL_TYPE_LUMA, pcEncTopBase->getSPS(), refLayerId);
784          const Int refBitDepthChroma = m_cVPS.getBitDepth(CHANNEL_TYPE_CHROMA, pcEncTopBase->getSPS(), refLayerId);
785
786          Bool sameBitDepths = ( bitDepthLuma == refBitDepthLuma ) && ( bitDepthChroma == refBitDepthChroma );
787
788          if( m_iSourceWidth != pcEncTopBase->getSourceWidth() || m_iSourceHeight != pcEncTopBase->getSourceHeight() || !sameBitDepths
789            || !equalOffsets
790            || !zeroPhase
791#if CGS_3D_ASYMLUT
792            || m_cPPS.getCGSFlag() > 0
793#endif
794#if LAYER_CTB
795            || pcEncTopBase->getSPS()->getMaxCUWidth() != m_cSPS.getMaxCUWidth() || pcEncTopBase->getSPS()->getMaxCUHeight() != m_cSPS.getMaxCUHeight() || pcEncTopBase->getSPS()->getMaxCUDepth() != m_cSPS.getMaxCUDepth()
796#endif
797            )
798          {
799            rpcPic->setSpatialEnhLayerFlag( i, true );
800
801            //only for scalable extension
802            assert( m_cVPS.getScalabilityMask( SCALABILITY_ID ) == true );
803          }
804        }
805      }
806
807      rpcPic->create( m_cVPS, m_cSPS, m_cPPS, false, m_layerId );
808#else  //SVC_EXTENSION
809      rpcPic->create( m_cSPS, m_cPPS, false );
810#endif //SVC_EXTENSION
811    }
812
813    m_cListPic.pushBack( rpcPic );
814  }
815  rpcPic->setReconMark (false);
816
817  m_iPOCLast++;
818  m_iNumPicRcvd++;
819
820  rpcPic->getSlice(0)->setPOC( m_iPOCLast );
821  // mark it should be extended
822  rpcPic->getPicYuvRec()->setBorderExtension(false);
823}
824
825Void TEncTop::xInitVPS()
826{
827  // The SPS must have already been set up.
828  // set the VPS profile information.
829#if SVC_EXTENSION
830  m_cVPS.setVpsVuiPresentFlag( true );
831#else
832  *m_cVPS.getPTL() = *m_cSPS.getPTL();
833  m_cVPS.setMaxOpSets(1);
834#endif
835  m_cVPS.getTimingInfo()->setTimingInfoPresentFlag       ( false );
836  m_cVPS.setNumHrdParameters( 0 );
837
838  m_cVPS.createHrdParamBuffer();
839  for( UInt i = 0; i < m_cVPS.getNumHrdParameters(); i ++ )
840  {
841    m_cVPS.setHrdOpSetIdx( 0, i );
842    m_cVPS.setCprmsPresentFlag( false, i );
843    // Set up HrdParameters here.
844  }
845}
846
847Void TEncTop::xInitSPS()
848{
849#if SVC_EXTENSION
850  m_cSPS.setExtensionFlag( m_layerId > 0 ? true : false );
851  m_cSPS.setNumDirectRefLayers(m_numDirectRefLayers);
852
853  if( !m_numDirectRefLayers && m_numAddLayerSets )
854  {
855    m_cSPS.setLayerId(0); // layer ID 0 for independent layers
856  }
857  else
858  {
859    m_cSPS.setLayerId(m_layerId);
860  }
861#endif //SVC_EXTENSION
862
863  ProfileTierLevel& profileTierLevel = *m_cSPS.getPTL()->getGeneralPTL();
864  profileTierLevel.setLevelIdc(m_level);
865  profileTierLevel.setTierFlag(m_levelTier);
866  profileTierLevel.setProfileIdc(m_profile);
867  profileTierLevel.setProfileCompatibilityFlag(m_profile, 1);
868  profileTierLevel.setProgressiveSourceFlag(m_progressiveSourceFlag);
869  profileTierLevel.setInterlacedSourceFlag(m_interlacedSourceFlag);
870  profileTierLevel.setNonPackedConstraintFlag(m_nonPackedConstraintFlag);
871  profileTierLevel.setFrameOnlyConstraintFlag(m_frameOnlyConstraintFlag);
872  profileTierLevel.setBitDepthConstraint(m_bitDepthConstraintValue);
873  profileTierLevel.setChromaFormatConstraint(m_chromaFormatConstraintValue);
874  profileTierLevel.setIntraConstraintFlag(m_intraConstraintFlag);
875  profileTierLevel.setLowerBitRateConstraintFlag(m_lowerBitRateConstraintFlag);
876
877  if ((m_profile == Profile::MAIN10) && (m_bitDepth[CHANNEL_TYPE_LUMA] == 8) && (m_bitDepth[CHANNEL_TYPE_CHROMA] == 8))
878  {
879    /* The above constraint is equal to Profile::MAIN */
880    profileTierLevel.setProfileCompatibilityFlag(Profile::MAIN, 1);
881  }
882  if (m_profile == Profile::MAIN)
883  {
884    /* A Profile::MAIN10 decoder can always decode Profile::MAIN */
885    profileTierLevel.setProfileCompatibilityFlag(Profile::MAIN10, 1);
886  }
887  /* XXX: should Main be marked as compatible with still picture? */
888  /* XXX: may be a good idea to refactor the above into a function
889   * that chooses the actual compatibility based upon options */
890
891  m_cSPS.setPicWidthInLumaSamples  ( m_iSourceWidth      );
892  m_cSPS.setPicHeightInLumaSamples ( m_iSourceHeight     );
893  m_cSPS.setConformanceWindow      ( m_conformanceWindow );
894  m_cSPS.setMaxCUWidth             ( m_maxCUWidth        );
895  m_cSPS.setMaxCUHeight            ( m_maxCUHeight       );
896  m_cSPS.setMaxTotalCUDepth        ( m_maxTotalCUDepth   );
897  m_cSPS.setChromaFormatIdc( m_chromaFormatIDC);
898  m_cSPS.setLog2DiffMaxMinCodingBlockSize(m_log2DiffMaxMinCodingBlockSize);
899
900  Int minCUSize = m_cSPS.getMaxCUWidth() >> ( m_cSPS.getLog2DiffMaxMinCodingBlockSize() );
901  Int log2MinCUSize = 0;
902  while(minCUSize > 1)
903  {
904    minCUSize >>= 1;
905    log2MinCUSize++;
906  }
907
908  m_cSPS.setLog2MinCodingBlockSize(log2MinCUSize);
909 
910#if SVC_EXTENSION
911  m_cSPS.setSPSId         ( m_iSPSIdCnt       );
912#endif
913 
914  m_cSPS.setPCMLog2MinSize (m_uiPCMLog2MinSize);
915  m_cSPS.setUsePCM        ( m_usePCM           );
916  m_cSPS.setPCMLog2MaxSize( m_pcmLog2MaxSize  );
917
918  m_cSPS.setQuadtreeTULog2MaxSize( m_uiQuadtreeTULog2MaxSize );
919  m_cSPS.setQuadtreeTULog2MinSize( m_uiQuadtreeTULog2MinSize );
920  m_cSPS.setQuadtreeTUMaxDepthInter( m_uiQuadtreeTUMaxDepthInter    );
921  m_cSPS.setQuadtreeTUMaxDepthIntra( m_uiQuadtreeTUMaxDepthIntra    );
922
923  m_cSPS.setTMVPFlagsPresent((getTMVPModeId() == 2 || getTMVPModeId() == 1));
924
925  m_cSPS.setMaxTrSize   ( 1 << m_uiQuadtreeTULog2MaxSize );
926
927  m_cSPS.setUseAMP ( m_useAMP );
928
929  for (UInt channelType = 0; channelType < MAX_NUM_CHANNEL_TYPE; channelType++)
930  {
931#if SVC_EXTENSION
932    m_cSPS.setBitDepth    (ChannelType(channelType), m_cVPS.getVpsRepFormat( m_cVPS.getVpsRepFormatIdx( m_cVPS.getLayerIdxInVps( m_layerId ) ) )->getBitDepthVps(ChannelType(channelType))            );   
933#if O0043_BEST_EFFORT_DECODING
934    m_cSPS.setStreamBitDepth(ChannelType(channelType), m_bitDepth[channelType] );
935#endif
936    m_cSPS.setQpBDOffset  (ChannelType(channelType), (6 * (m_cVPS.getVpsRepFormat( m_cVPS.getVpsRepFormatIdx( m_cVPS.getLayerIdxInVps( m_layerId ) ) )->getBitDepthVps(ChannelType(channelType)) - 8)));
937#else
938    m_cSPS.setBitDepth      (ChannelType(channelType), m_bitDepth[channelType] );
939#if O0043_BEST_EFFORT_DECODING
940    m_cSPS.setStreamBitDepth(ChannelType(channelType), m_bitDepth[channelType] );
941#endif
942    m_cSPS.setQpBDOffset  (ChannelType(channelType), (6 * (m_bitDepth[channelType] - 8)));
943#endif
944    m_cSPS.setPCMBitDepth (ChannelType(channelType), m_PCMBitDepth[channelType]         );
945  }
946
947  m_cSPS.setUseSAO( m_bUseSAO );
948
949  m_cSPS.setMaxTLayers( m_maxTempLayer );
950  m_cSPS.setTemporalIdNestingFlag( ( m_maxTempLayer == 1 ) ? true : false );
951
952  for (Int i = 0; i < min(m_cSPS.getMaxTLayers(),(UInt) MAX_TLAYER); i++ )
953  {
954#if SVC_EXTENSION
955    assert( i < MAX_TLAYER );
956#endif
957    m_cSPS.setMaxDecPicBuffering(m_maxDecPicBuffering[i], i);
958    m_cSPS.setNumReorderPics(m_numReorderPics[i], i);
959  }
960
961  m_cSPS.setPCMFilterDisableFlag  ( m_bPCMFilterDisableFlag );
962  m_cSPS.setScalingListFlag ( (m_useScalingListId == SCALING_LIST_OFF) ? 0 : 1 );
963  m_cSPS.setUseStrongIntraSmoothing( m_useStrongIntraSmoothing );
964  m_cSPS.setVuiParametersPresentFlag(getVuiParametersPresentFlag());
965
966  if (m_cSPS.getVuiParametersPresentFlag())
967  {
968    TComVUI* pcVUI = m_cSPS.getVuiParameters();
969    pcVUI->setAspectRatioInfoPresentFlag(getAspectRatioInfoPresentFlag());
970    pcVUI->setAspectRatioIdc(getAspectRatioIdc());
971    pcVUI->setSarWidth(getSarWidth());
972    pcVUI->setSarHeight(getSarHeight());
973    pcVUI->setOverscanInfoPresentFlag(getOverscanInfoPresentFlag());
974    pcVUI->setOverscanAppropriateFlag(getOverscanAppropriateFlag());
975    pcVUI->setVideoSignalTypePresentFlag(getVideoSignalTypePresentFlag());
976    pcVUI->setVideoFormat(getVideoFormat());
977    pcVUI->setVideoFullRangeFlag(getVideoFullRangeFlag());
978    pcVUI->setColourDescriptionPresentFlag(getColourDescriptionPresentFlag());
979    pcVUI->setColourPrimaries(getColourPrimaries());
980    pcVUI->setTransferCharacteristics(getTransferCharacteristics());
981    pcVUI->setMatrixCoefficients(getMatrixCoefficients());
982    pcVUI->setChromaLocInfoPresentFlag(getChromaLocInfoPresentFlag());
983    pcVUI->setChromaSampleLocTypeTopField(getChromaSampleLocTypeTopField());
984    pcVUI->setChromaSampleLocTypeBottomField(getChromaSampleLocTypeBottomField());
985    pcVUI->setNeutralChromaIndicationFlag(getNeutralChromaIndicationFlag());
986    pcVUI->setDefaultDisplayWindow(getDefaultDisplayWindow());
987    pcVUI->setFrameFieldInfoPresentFlag(getFrameFieldInfoPresentFlag());
988    pcVUI->setFieldSeqFlag(false);
989    pcVUI->setHrdParametersPresentFlag(false);
990    pcVUI->getTimingInfo()->setPocProportionalToTimingFlag(getPocProportionalToTimingFlag());
991    pcVUI->getTimingInfo()->setNumTicksPocDiffOneMinus1   (getNumTicksPocDiffOneMinus1()   );
992    pcVUI->setBitstreamRestrictionFlag(getBitstreamRestrictionFlag());
993    pcVUI->setTilesFixedStructureFlag(getTilesFixedStructureFlag());
994    pcVUI->setMotionVectorsOverPicBoundariesFlag(getMotionVectorsOverPicBoundariesFlag());
995    pcVUI->setMinSpatialSegmentationIdc(getMinSpatialSegmentationIdc());
996    pcVUI->setMaxBytesPerPicDenom(getMaxBytesPerPicDenom());
997    pcVUI->setMaxBitsPerMinCuDenom(getMaxBitsPerMinCuDenom());
998    pcVUI->setLog2MaxMvLengthHorizontal(getLog2MaxMvLengthHorizontal());
999    pcVUI->setLog2MaxMvLengthVertical(getLog2MaxMvLengthVertical());
1000  }
1001  m_cSPS.setNumLongTermRefPicSPS(NUM_LONG_TERM_REF_PIC_SPS);
1002  assert (NUM_LONG_TERM_REF_PIC_SPS <= MAX_NUM_LONG_TERM_REF_PICS);
1003  for (Int k = 0; k < NUM_LONG_TERM_REF_PIC_SPS; k++)
1004  {
1005    m_cSPS.setLtRefPicPocLsbSps(k, 0);
1006    m_cSPS.setUsedByCurrPicLtSPSFlag(k, 0);
1007  }
1008  if( getPictureTimingSEIEnabled() || getDecodingUnitInfoSEIEnabled() )
1009  {
1010    xInitHrdParameters();
1011  }
1012  if( getBufferingPeriodSEIEnabled() || getPictureTimingSEIEnabled() || getDecodingUnitInfoSEIEnabled() )
1013  {
1014    m_cSPS.getVuiParameters()->setHrdParametersPresentFlag( true );
1015  }
1016
1017  // Set up SPS range extension settings
1018  m_cSPS.getSpsRangeExtension().setTransformSkipRotationEnabledFlag(m_transformSkipRotationEnabledFlag);
1019  m_cSPS.getSpsRangeExtension().setTransformSkipContextEnabledFlag(m_transformSkipContextEnabledFlag);
1020  for (UInt signallingModeIndex = 0; signallingModeIndex < NUMBER_OF_RDPCM_SIGNALLING_MODES; signallingModeIndex++)
1021  {
1022    m_cSPS.getSpsRangeExtension().setRdpcmEnabledFlag(RDPCMSignallingMode(signallingModeIndex), m_rdpcmEnabledFlag[signallingModeIndex]);
1023  }
1024  m_cSPS.getSpsRangeExtension().setExtendedPrecisionProcessingFlag(m_extendedPrecisionProcessingFlag);
1025  m_cSPS.getSpsRangeExtension().setIntraSmoothingDisabledFlag( m_intraSmoothingDisabledFlag );
1026  m_cSPS.getSpsRangeExtension().setHighPrecisionOffsetsEnabledFlag(m_highPrecisionOffsetsEnabledFlag);
1027  m_cSPS.getSpsRangeExtension().setPersistentRiceAdaptationEnabledFlag(m_persistentRiceAdaptationEnabledFlag);
1028  m_cSPS.getSpsRangeExtension().setCabacBypassAlignmentEnabledFlag(m_cabacBypassAlignmentEnabledFlag);
1029}
1030
1031Void TEncTop::xInitHrdParameters()
1032{
1033  Bool useSubCpbParams = (getSliceMode() > 0) || (getSliceSegmentMode() > 0);
1034  Int  bitRate         = getTargetBitrate();
1035  Bool isRandomAccess  = getIntraPeriod() > 0;
1036
1037  if( !getVuiParametersPresentFlag() )
1038  {
1039    return;
1040  }
1041
1042  TComVUI *vui = m_cSPS.getVuiParameters();
1043  TComHRD *hrd = vui->getHrdParameters();
1044
1045  TimingInfo *timingInfo = vui->getTimingInfo();
1046
1047#if SVC_EXTENSION
1048  if( m_layerId > 0 )
1049  {
1050    timingInfo->setTimingInfoPresentFlag( false );
1051    return;
1052  }
1053#endif
1054
1055  timingInfo->setTimingInfoPresentFlag( true );
1056  switch( getFrameRate() )
1057  {
1058  case 24:
1059    timingInfo->setNumUnitsInTick( 1125000 );    timingInfo->setTimeScale    ( 27000000 );
1060    break;
1061  case 25:
1062    timingInfo->setNumUnitsInTick( 1080000 );    timingInfo->setTimeScale    ( 27000000 );
1063    break;
1064  case 30:
1065    timingInfo->setNumUnitsInTick( 900900 );     timingInfo->setTimeScale    ( 27000000 );
1066    break;
1067  case 50:
1068    timingInfo->setNumUnitsInTick( 540000 );     timingInfo->setTimeScale    ( 27000000 );
1069    break;
1070  case 60:
1071    timingInfo->setNumUnitsInTick( 450450 );     timingInfo->setTimeScale    ( 27000000 );
1072    break;
1073  default:
1074    timingInfo->setNumUnitsInTick( 1001 );       timingInfo->setTimeScale    ( 60000 );
1075    break;
1076  }
1077
1078  Bool rateCnt = ( bitRate > 0 );
1079  hrd->setNalHrdParametersPresentFlag( rateCnt );
1080  hrd->setVclHrdParametersPresentFlag( rateCnt );
1081
1082  hrd->setSubPicCpbParamsPresentFlag( useSubCpbParams );
1083
1084  if( hrd->getSubPicCpbParamsPresentFlag() )
1085  {
1086    hrd->setTickDivisorMinus2( 100 - 2 );                          //
1087    hrd->setDuCpbRemovalDelayLengthMinus1( 7 );                    // 8-bit precision ( plus 1 for last DU in AU )
1088    hrd->setSubPicCpbParamsInPicTimingSEIFlag( true );
1089    hrd->setDpbOutputDelayDuLengthMinus1( 5 + 7 );                 // With sub-clock tick factor of 100, at least 7 bits to have the same value as AU dpb delay
1090  }
1091  else
1092  {
1093    hrd->setSubPicCpbParamsInPicTimingSEIFlag( false );
1094  }
1095
1096  hrd->setBitRateScale( 4 );                                       // in units of 2^( 6 + 4 ) = 1,024 bps
1097  hrd->setCpbSizeScale( 6 );                                       // in units of 2^( 4 + 6 ) = 1,024 bit
1098  hrd->setDuCpbSizeScale( 6 );                                     // in units of 2^( 4 + 6 ) = 1,024 bit
1099
1100  hrd->setInitialCpbRemovalDelayLengthMinus1(15);                  // assuming 0.5 sec, log2( 90,000 * 0.5 ) = 16-bit
1101  if( isRandomAccess )
1102  {
1103    hrd->setCpbRemovalDelayLengthMinus1(5);                        // 32 = 2^5 (plus 1)
1104    hrd->setDpbOutputDelayLengthMinus1 (5);                        // 32 + 3 = 2^6
1105  }
1106  else
1107  {
1108    hrd->setCpbRemovalDelayLengthMinus1(9);                        // max. 2^10
1109    hrd->setDpbOutputDelayLengthMinus1 (9);                        // max. 2^10
1110  }
1111
1112  // Note: parameters for all temporal layers are initialized with the same values
1113  Int i, j;
1114  UInt bitrateValue, cpbSizeValue;
1115  UInt duCpbSizeValue;
1116  UInt duBitRateValue = 0;
1117
1118  for( i = 0; i < MAX_TLAYER; i ++ )
1119  {
1120    hrd->setFixedPicRateFlag( i, 1 );
1121    hrd->setPicDurationInTcMinus1( i, 0 );
1122    hrd->setLowDelayHrdFlag( i, 0 );
1123    hrd->setCpbCntMinus1( i, 0 );
1124
1125    //! \todo check for possible PTL violations
1126    // BitRate[ i ] = ( bit_rate_value_minus1[ i ] + 1 ) * 2^( 6 + bit_rate_scale )
1127    bitrateValue = bitRate / (1 << (6 + hrd->getBitRateScale()) );      // bitRate is in bits, so it needs to be scaled down
1128    // CpbSize[ i ] = ( cpb_size_value_minus1[ i ] + 1 ) * 2^( 4 + cpb_size_scale )
1129    cpbSizeValue = bitRate / (1 << (4 + hrd->getCpbSizeScale()) );      // using bitRate results in 1 second CPB size
1130
1131    // DU CPB size could be smaller (i.e. bitrateValue / number of DUs), but we don't know
1132    // in how many DUs the slice segment settings will result
1133    duCpbSizeValue = bitrateValue;
1134    duBitRateValue = cpbSizeValue;
1135
1136    for( j = 0; j < ( hrd->getCpbCntMinus1( i ) + 1 ); j ++ )
1137    {
1138      hrd->setBitRateValueMinus1( i, j, 0, ( bitrateValue - 1 ) );
1139      hrd->setCpbSizeValueMinus1( i, j, 0, ( cpbSizeValue - 1 ) );
1140      hrd->setDuCpbSizeValueMinus1( i, j, 0, ( duCpbSizeValue - 1 ) );
1141      hrd->setCbrFlag( i, j, 0, false );
1142
1143      hrd->setBitRateValueMinus1( i, j, 1, ( bitrateValue - 1) );
1144      hrd->setCpbSizeValueMinus1( i, j, 1, ( cpbSizeValue - 1 ) );
1145      hrd->setDuCpbSizeValueMinus1( i, j, 1, ( duCpbSizeValue - 1 ) );
1146      hrd->setDuBitRateValueMinus1( i, j, 1, ( duBitRateValue - 1 ) );
1147      hrd->setCbrFlag( i, j, 1, false );
1148    }
1149  }
1150}
1151
1152Void TEncTop::xInitPPS()
1153{
1154  m_cPPS.setConstrainedIntraPred( m_bUseConstrainedIntraPred );
1155  Bool bUseDQP = (getMaxCuDQPDepth() > 0)? true : false;
1156
1157  if((getMaxDeltaQP() != 0 )|| getUseAdaptiveQP())
1158  {
1159    bUseDQP = true;
1160  }
1161
1162  if (m_costMode==COST_SEQUENCE_LEVEL_LOSSLESS || m_costMode==COST_LOSSLESS_CODING)
1163  {
1164    bUseDQP=false;
1165  }
1166
1167
1168  if ( m_RCEnableRateControl )
1169  {
1170    m_cPPS.setUseDQP(true);
1171    m_cPPS.setMaxCuDQPDepth( 0 );
1172  }
1173  else if(bUseDQP)
1174  {
1175    m_cPPS.setUseDQP(true);
1176    m_cPPS.setMaxCuDQPDepth( m_iMaxCuDQPDepth );
1177  }
1178  else
1179  {
1180    m_cPPS.setUseDQP(false);
1181    m_cPPS.setMaxCuDQPDepth( 0 );
1182  }
1183
1184  if ( m_diffCuChromaQpOffsetDepth >= 0 )
1185  {
1186    m_cPPS.getPpsRangeExtension().setDiffCuChromaQpOffsetDepth(m_diffCuChromaQpOffsetDepth);
1187    m_cPPS.getPpsRangeExtension().clearChromaQpOffsetList();
1188    m_cPPS.getPpsRangeExtension().setChromaQpOffsetListEntry(1, 6, 6);
1189    /* todo, insert table entries from command line (NB, 0 should not be touched) */
1190  }
1191  else
1192  {
1193    m_cPPS.getPpsRangeExtension().setDiffCuChromaQpOffsetDepth(0);
1194    m_cPPS.getPpsRangeExtension().clearChromaQpOffsetList();
1195  }
1196  m_cPPS.getPpsRangeExtension().setCrossComponentPredictionEnabledFlag(m_crossComponentPredictionEnabledFlag);
1197  m_cPPS.getPpsRangeExtension().setLog2SaoOffsetScale(CHANNEL_TYPE_LUMA,   m_log2SaoOffsetScale[CHANNEL_TYPE_LUMA  ]);
1198  m_cPPS.getPpsRangeExtension().setLog2SaoOffsetScale(CHANNEL_TYPE_CHROMA, m_log2SaoOffsetScale[CHANNEL_TYPE_CHROMA]);
1199
1200  m_cPPS.setQpOffset(COMPONENT_Cb, m_chromaCbQpOffset );
1201  m_cPPS.setQpOffset(COMPONENT_Cr, m_chromaCrQpOffset );
1202
1203  m_cPPS.setEntropyCodingSyncEnabledFlag( m_iWaveFrontSynchro > 0 );
1204  m_cPPS.setTilesEnabledFlag( (m_iNumColumnsMinus1 > 0 || m_iNumRowsMinus1 > 0) );
1205  m_cPPS.setUseWP( m_useWeightedPred );
1206  m_cPPS.setWPBiPred( m_useWeightedBiPred );
1207  m_cPPS.setOutputFlagPresentFlag( false );
1208  m_cPPS.setSignHideFlag(getSignHideFlag());
1209
1210  if ( getDeblockingFilterMetric() )
1211  {
1212    m_cPPS.setDeblockingFilterOverrideEnabledFlag(true);
1213    m_cPPS.setPicDisableDeblockingFilterFlag(false);
1214  }
1215  else
1216  {
1217    m_cPPS.setDeblockingFilterOverrideEnabledFlag( !getLoopFilterOffsetInPPS() );
1218    m_cPPS.setPicDisableDeblockingFilterFlag( getLoopFilterDisable() );
1219  }
1220
1221  if (! m_cPPS.getPicDisableDeblockingFilterFlag())
1222  {
1223    m_cPPS.setDeblockingFilterBetaOffsetDiv2( getLoopFilterBetaOffset() );
1224    m_cPPS.setDeblockingFilterTcOffsetDiv2( getLoopFilterTcOffset() );
1225  }
1226  else
1227  {
1228    m_cPPS.setDeblockingFilterBetaOffsetDiv2(0);
1229    m_cPPS.setDeblockingFilterTcOffsetDiv2(0);
1230  }
1231
1232  // deblockingFilterControlPresentFlag is true if any of the settings differ from the inferred values:
1233  const Bool deblockingFilterControlPresentFlag = m_cPPS.getDeblockingFilterOverrideEnabledFlag() ||
1234                                                  m_cPPS.getPicDisableDeblockingFilterFlag()      ||
1235                                                  m_cPPS.getDeblockingFilterBetaOffsetDiv2() != 0 ||
1236                                                  m_cPPS.getDeblockingFilterTcOffsetDiv2() != 0;
1237
1238  m_cPPS.setDeblockingFilterControlPresentFlag(deblockingFilterControlPresentFlag);
1239
1240  m_cPPS.setLog2ParallelMergeLevelMinus2   (m_log2ParallelMergeLevelMinus2 );
1241  m_cPPS.setCabacInitPresentFlag(CABAC_INIT_PRESENT_FLAG);
1242  m_cPPS.setLoopFilterAcrossSlicesEnabledFlag( m_bLFCrossSliceBoundaryFlag );
1243
1244
1245  Int histogram[MAX_NUM_REF + 1];
1246  for( Int i = 0; i <= MAX_NUM_REF; i++ )
1247  {
1248    histogram[i]=0;
1249  }
1250  for( Int i = 0; i < getGOPSize(); i++)
1251  {
1252    assert(getGOPEntry(i).m_numRefPicsActive >= 0 && getGOPEntry(i).m_numRefPicsActive <= MAX_NUM_REF);
1253    histogram[getGOPEntry(i).m_numRefPicsActive]++;
1254  }
1255
1256  Int maxHist=-1;
1257  Int bestPos=0;
1258  for( Int i = 0; i <= MAX_NUM_REF; i++ )
1259  {
1260    if(histogram[i]>maxHist)
1261    {
1262      maxHist=histogram[i];
1263      bestPos=i;
1264    }
1265  }
1266  assert(bestPos <= 15);
1267  m_cPPS.setNumRefIdxL0DefaultActive(bestPos);
1268  m_cPPS.setNumRefIdxL1DefaultActive(bestPos);
1269  m_cPPS.setTransquantBypassEnableFlag(getTransquantBypassEnableFlag());
1270  m_cPPS.setUseTransformSkip( m_useTransformSkip );
1271  m_cPPS.getPpsRangeExtension().setLog2MaxTransformSkipBlockSize( m_log2MaxTransformSkipBlockSize  );
1272
1273  if (m_sliceSegmentMode != NO_SLICES)
1274  {
1275    m_cPPS.setDependentSliceSegmentsEnabledFlag( true );
1276  }
1277 
1278#if SVC_EXTENSION
1279  m_cPPS.setLayerId( m_layerId );
1280
1281  if( !m_numDirectRefLayers && m_numAddLayerSets )
1282  {
1283    m_cPPS.setLayerId(0); // layer ID 0 for independent layers
1284  }
1285
1286  if( m_layerId > 0 )
1287  {
1288    m_cPPS.setListsModificationPresentFlag(true);
1289    m_cPPS.setExtensionFlag(true);
1290  }
1291  else
1292  {
1293    m_cPPS.setListsModificationPresentFlag(false);
1294    m_cPPS.setExtensionFlag(false);
1295  }
1296
1297  m_cPPS.setPPSId( m_iPPSIdCnt );
1298  m_cPPS.setSPSId( m_iSPSIdCnt );
1299
1300  if( m_crossLayerBLAFlag )
1301  {
1302    m_cPPS.setNumExtraSliceHeaderBits( 3 );
1303  }
1304
1305  m_cPPS.setNumRefLayerLocationOffsets(m_numRefLayerLocationOffsets);
1306  for(Int i = 0; i < m_cPPS.getNumRefLayerLocationOffsets(); i++)
1307  {
1308    m_cPPS.setRefLocationOffsetLayerId(i, m_refLocationOffsetLayerId[i]);
1309    m_cPPS.getScaledRefLayerWindow(i) = m_scaledRefLayerWindow[i];
1310    m_cPPS.getRefLayerWindow(i) = m_refLayerWindow[i];
1311    m_cPPS.setScaledRefLayerOffsetPresentFlag( i, m_scaledRefLayerOffsetPresentFlag[i] );
1312    m_cPPS.setRefRegionOffsetPresentFlag( i, m_refRegionOffsetPresentFlag[i] );
1313    m_cPPS.setResamplePhaseSetPresentFlag( i, m_resamplePhaseSetPresentFlag[i] );
1314    m_cPPS.setPhaseHorLuma( m_refLocationOffsetLayerId[i], m_phaseHorLuma[i] );
1315    m_cPPS.setPhaseVerLuma( m_refLocationOffsetLayerId[i], m_phaseVerLuma[i] );
1316    m_cPPS.setPhaseHorChroma( m_refLocationOffsetLayerId[i], m_phaseHorChroma[i] );
1317    m_cPPS.setPhaseVerChroma( m_refLocationOffsetLayerId[i], m_phaseVerChroma[i] );
1318  }
1319#if CGS_3D_ASYMLUT
1320  m_cPPS.setCGSFlag( m_nCGSFlag );
1321#endif
1322  m_cPPS.setPocResetInfoPresentFlag( true );
1323  m_cPPS.setExtensionFlag( true );
1324  m_cPPS.setSliceHeaderExtensionPresentFlag( true );
1325#endif //SVC_EXTENSION
1326}
1327
1328//Function for initializing m_RPSList, a list of TComReferencePictureSet, based on the GOPEntry objects read from the config file.
1329Void TEncTop::xInitRPS(Bool isFieldCoding)
1330{
1331  TComReferencePictureSet*      rps;
1332
1333  m_cSPS.createRPSList(getGOPSize() + m_extraRPSs + 1);
1334  TComRPSList* rpsList = m_cSPS.getRPSList();
1335
1336  for( Int i = 0; i < getGOPSize()+m_extraRPSs; i++)
1337  {
1338    GOPEntry ge = getGOPEntry(i);
1339    rps = rpsList->getReferencePictureSet(i);
1340    rps->setNumberOfPictures(ge.m_numRefPics);
1341    rps->setNumRefIdc(ge.m_numRefIdc);
1342    Int numNeg = 0;
1343    Int numPos = 0;
1344    for( Int j = 0; j < ge.m_numRefPics; j++)
1345    {
1346      rps->setDeltaPOC(j,ge.m_referencePics[j]);
1347      rps->setUsed(j,ge.m_usedByCurrPic[j]);
1348      if(ge.m_referencePics[j]>0)
1349      {
1350        numPos++;
1351      }
1352      else
1353      {
1354        numNeg++;
1355      }
1356    }
1357    rps->setNumberOfNegativePictures(numNeg);
1358    rps->setNumberOfPositivePictures(numPos);
1359
1360    // handle inter RPS intialization from the config file.
1361    rps->setInterRPSPrediction(ge.m_interRPSPrediction > 0);  // not very clean, converting anything > 0 to true.
1362    rps->setDeltaRIdxMinus1(0);                               // index to the Reference RPS is always the previous one.
1363    TComReferencePictureSet*     RPSRef = i>0 ? rpsList->getReferencePictureSet(i-1): NULL;  // get the reference RPS
1364
1365    if (ge.m_interRPSPrediction == 2)  // Automatic generation of the inter RPS idc based on the RIdx provided.
1366    {
1367      assert (RPSRef!=NULL);
1368      Int deltaRPS = getGOPEntry(i-1).m_POC - ge.m_POC;  // the ref POC - current POC
1369      Int numRefDeltaPOC = RPSRef->getNumberOfPictures();
1370
1371      rps->setDeltaRPS(deltaRPS);           // set delta RPS
1372      rps->setNumRefIdc(numRefDeltaPOC+1);  // set the numRefIdc to the number of pictures in the reference RPS + 1.
1373      Int count=0;
1374      for (Int j = 0; j <= numRefDeltaPOC; j++ ) // cycle through pics in reference RPS.
1375      {
1376        Int RefDeltaPOC = (j<numRefDeltaPOC)? RPSRef->getDeltaPOC(j): 0;  // if it is the last decoded picture, set RefDeltaPOC = 0
1377        rps->setRefIdc(j, 0);
1378        for (Int k = 0; k < rps->getNumberOfPictures(); k++ )  // cycle through pics in current RPS.
1379        {
1380          if (rps->getDeltaPOC(k) == ( RefDeltaPOC + deltaRPS))  // if the current RPS has a same picture as the reference RPS.
1381          {
1382              rps->setRefIdc(j, (rps->getUsed(k)?1:2));
1383              count++;
1384              break;
1385          }
1386        }
1387      }
1388      if (count != rps->getNumberOfPictures())
1389      {
1390        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");
1391        rps->setInterRPSPrediction(0);
1392      }
1393    }
1394    else if (ge.m_interRPSPrediction == 1)  // inter RPS idc based on the RefIdc values provided in config file.
1395    {
1396      assert (RPSRef!=NULL);
1397      rps->setDeltaRPS(ge.m_deltaRPS);
1398      rps->setNumRefIdc(ge.m_numRefIdc);
1399      for (Int j = 0; j < ge.m_numRefIdc; j++ )
1400      {
1401        rps->setRefIdc(j, ge.m_refIdc[j]);
1402      }
1403      // the following code overwrite the deltaPOC and Used by current values read from the config file with the ones
1404      // computed from the RefIdc.  A warning is printed if they are not identical.
1405      numNeg = 0;
1406      numPos = 0;
1407      TComReferencePictureSet      RPSTemp;  // temporary variable
1408
1409      for (Int j = 0; j < ge.m_numRefIdc; j++ )
1410      {
1411        if (ge.m_refIdc[j])
1412        {
1413          Int deltaPOC = ge.m_deltaRPS + ((j < RPSRef->getNumberOfPictures())? RPSRef->getDeltaPOC(j) : 0);
1414          RPSTemp.setDeltaPOC((numNeg+numPos),deltaPOC);
1415          RPSTemp.setUsed((numNeg+numPos),ge.m_refIdc[j]==1?1:0);
1416          if (deltaPOC<0)
1417          {
1418            numNeg++;
1419          }
1420          else
1421          {
1422            numPos++;
1423          }
1424        }
1425      }
1426      if (numNeg != rps->getNumberOfNegativePictures())
1427      {
1428        printf("Warning: number of negative pictures in RPS is different between intra and inter RPS specified in the config file.\n");
1429        rps->setNumberOfNegativePictures(numNeg);
1430        rps->setNumberOfPictures(numNeg+numPos);
1431      }
1432      if (numPos != rps->getNumberOfPositivePictures())
1433      {
1434        printf("Warning: number of positive pictures in RPS is different between intra and inter RPS specified in the config file.\n");
1435        rps->setNumberOfPositivePictures(numPos);
1436        rps->setNumberOfPictures(numNeg+numPos);
1437      }
1438      RPSTemp.setNumberOfPictures(numNeg+numPos);
1439      RPSTemp.setNumberOfNegativePictures(numNeg);
1440      RPSTemp.sortDeltaPOC();     // sort the created delta POC before comparing
1441      // check if Delta POC and Used are the same
1442      // print warning if they are not.
1443      for (Int j = 0; j < ge.m_numRefIdc; j++ )
1444      {
1445        if (RPSTemp.getDeltaPOC(j) != rps->getDeltaPOC(j))
1446        {
1447          printf("Warning: delta POC is different between intra RPS and inter RPS specified in the config file.\n");
1448          rps->setDeltaPOC(j,RPSTemp.getDeltaPOC(j));
1449        }
1450        if (RPSTemp.getUsed(j) != rps->getUsed(j))
1451        {
1452          printf("Warning: Used by Current in RPS is different between intra and inter RPS specified in the config file.\n");
1453          rps->setUsed(j,RPSTemp.getUsed(j));
1454        }
1455      }
1456    }
1457  }
1458  //In case of field coding, we need to set special parameters for the first bottom field of the sequence, since it is not specified in the cfg file.
1459  //The position = GOPSize + extraRPSs which is (a priori) unused is reserved for this field in the RPS.
1460  if (isFieldCoding)
1461  {
1462    rps = rpsList->getReferencePictureSet(getGOPSize()+m_extraRPSs);
1463    rps->setNumberOfPictures(1);
1464    rps->setNumberOfNegativePictures(1);
1465    rps->setNumberOfPositivePictures(0);
1466    rps->setNumberOfLongtermPictures(0);
1467    rps->setDeltaPOC(0,-1);
1468    rps->setPOC(0,0);
1469    rps->setUsed(0,true);
1470    rps->setInterRPSPrediction(false);
1471    rps->setDeltaRIdxMinus1(0);
1472    rps->setDeltaRPS(0);
1473    rps->setNumRefIdc(0);
1474  }
1475}
1476
1477   // This is a function that
1478   // determines what Reference Picture Set to use
1479   // for a specific slice (with POC = POCCurr)
1480Void TEncTop::selectReferencePictureSet(TComSlice* slice, Int POCCurr, Int GOPid )
1481{
1482  slice->setRPSidx(GOPid);
1483
1484  for(Int extraNum=m_iGOPSize; extraNum<m_extraRPSs+m_iGOPSize; extraNum++)
1485  {
1486    if(m_uiIntraPeriod > 0 && getDecodingRefreshType() > 0)
1487    {
1488      Int POCIndex = POCCurr%m_uiIntraPeriod;
1489      if(POCIndex == 0)
1490      {
1491        POCIndex = m_uiIntraPeriod;
1492      }
1493      if(POCIndex == m_GOPList[extraNum].m_POC)
1494      {
1495        slice->setRPSidx(extraNum);
1496      }
1497    }
1498    else
1499    {
1500      if(POCCurr==m_GOPList[extraNum].m_POC)
1501      {
1502        slice->setRPSidx(extraNum);
1503      }
1504    }
1505  }
1506
1507  if(POCCurr == 1 && slice->getPic()->isField())
1508  {
1509    slice->setRPSidx(m_iGOPSize+m_extraRPSs);
1510  }
1511
1512  TComReferencePictureSet *rps=slice->getLocalRPS();
1513  (*rps) = *(slice->getSPS()->getRPSList()->getReferencePictureSet(slice->getRPSidx()));
1514  slice->setRPS(rps);
1515  slice->getRPS()->setNumberOfPictures(slice->getRPS()->getNumberOfNegativePictures()+slice->getRPS()->getNumberOfPositivePictures());
1516}
1517
1518Int TEncTop::getReferencePictureSetIdxForSOP(Int POCCurr, Int GOPid )
1519{
1520  Int rpsIdx = GOPid;
1521
1522  for(Int extraNum=m_iGOPSize; extraNum<m_extraRPSs+m_iGOPSize; extraNum++)
1523  {
1524    if(m_uiIntraPeriod > 0 && getDecodingRefreshType() > 0)
1525    {
1526      Int POCIndex = POCCurr%m_uiIntraPeriod;
1527      if(POCIndex == 0)
1528      {
1529        POCIndex = m_uiIntraPeriod;
1530      }
1531      if(POCIndex == m_GOPList[extraNum].m_POC)
1532      {
1533        rpsIdx = extraNum;
1534      }
1535    }
1536    else
1537    {
1538      if(POCCurr==m_GOPList[extraNum].m_POC)
1539      {
1540        rpsIdx = extraNum;
1541      }
1542    }
1543  }
1544
1545  return rpsIdx;
1546}
1547
1548Void  TEncTop::xInitPPSforTiles()
1549{
1550  m_cPPS.setTileUniformSpacingFlag( m_tileUniformSpacingFlag );
1551  m_cPPS.setNumTileColumnsMinus1( m_iNumColumnsMinus1 );
1552  m_cPPS.setNumTileRowsMinus1( m_iNumRowsMinus1 );
1553  if( !m_tileUniformSpacingFlag )
1554  {
1555    m_cPPS.setTileColumnWidth( m_tileColumnWidth );
1556    m_cPPS.setTileRowHeight( m_tileRowHeight );
1557  }
1558  m_cPPS.setLoopFilterAcrossTilesEnabledFlag( m_loopFilterAcrossTilesEnabledFlag );
1559
1560  // # substreams is "per tile" when tiles are independent.
1561}
1562
1563Void  TEncCfg::xCheckGSParameters()
1564{
1565  Int   iWidthInCU = ( m_iSourceWidth%m_maxCUWidth ) ? m_iSourceWidth/m_maxCUWidth + 1 : m_iSourceWidth/m_maxCUWidth;
1566  Int   iHeightInCU = ( m_iSourceHeight%m_maxCUHeight ) ? m_iSourceHeight/m_maxCUHeight + 1 : m_iSourceHeight/m_maxCUHeight;
1567  UInt  uiCummulativeColumnWidth = 0;
1568  UInt  uiCummulativeRowHeight = 0;
1569
1570  //check the column relative parameters
1571  if( m_iNumColumnsMinus1 >= (1<<(LOG2_MAX_NUM_COLUMNS_MINUS1+1)) )
1572  {
1573    printf( "The number of columns is larger than the maximum allowed number of columns.\n" );
1574    exit( EXIT_FAILURE );
1575  }
1576
1577  if( m_iNumColumnsMinus1 >= iWidthInCU )
1578  {
1579    printf( "The current picture can not have so many columns.\n" );
1580    exit( EXIT_FAILURE );
1581  }
1582
1583  if( m_iNumColumnsMinus1 && !m_tileUniformSpacingFlag )
1584  {
1585    for(Int i=0; i<m_iNumColumnsMinus1; i++)
1586    {
1587      uiCummulativeColumnWidth += m_tileColumnWidth[i];
1588    }
1589
1590    if( uiCummulativeColumnWidth >= iWidthInCU )
1591    {
1592      printf( "The width of the column is too large.\n" );
1593      exit( EXIT_FAILURE );
1594    }
1595  }
1596
1597  //check the row relative parameters
1598  if( m_iNumRowsMinus1 >= (1<<(LOG2_MAX_NUM_ROWS_MINUS1+1)) )
1599  {
1600    printf( "The number of rows is larger than the maximum allowed number of rows.\n" );
1601    exit( EXIT_FAILURE );
1602  }
1603
1604  if( m_iNumRowsMinus1 >= iHeightInCU )
1605  {
1606    printf( "The current picture can not have so many rows.\n" );
1607    exit( EXIT_FAILURE );
1608  }
1609
1610  if( m_iNumRowsMinus1 && !m_tileUniformSpacingFlag )
1611  {
1612    for(Int i=0; i<m_iNumRowsMinus1; i++)
1613    {
1614      uiCummulativeRowHeight += m_tileRowHeight[i];
1615    }
1616
1617    if( uiCummulativeRowHeight >= iHeightInCU )
1618    {
1619      printf( "The height of the row is too large.\n" );
1620      exit( EXIT_FAILURE );
1621    }
1622  }
1623}
1624
1625#if SVC_EXTENSION
1626TEncTop* TEncTop::getRefLayerEnc( UInt refLayerIdx )
1627{
1628  if( m_ppcTEncTop[m_cVPS.getLayerIdxInVps(m_layerId)]->getNumDirectRefLayers() <= 0 )
1629  {
1630    return (TEncTop *)getLayerEnc( 0 );
1631  }
1632
1633  return (TEncTop *)getLayerEnc( m_cVPS.getLayerIdxInVps(m_cVPS.getRefLayerId( m_layerId, refLayerIdx )) );
1634}
1635
1636Void TEncTop::xInitILRP()
1637{
1638  if( m_layerId > 0 )
1639  {
1640    if( m_cIlpPic[0] == NULL )
1641    {
1642      for (Int j=0; j < m_numDirectRefLayers; j++)
1643      {
1644        m_cIlpPic[j] = new TComPic;
1645        m_cIlpPic[j]->create(m_cVPS, m_cSPS, m_cPPS, true, m_layerId);
1646        for (Int i=0; i<m_cIlpPic[j]->getPicSym()->getNumberOfCtusInFrame(); i++)
1647        {
1648          m_cIlpPic[j]->getPicSym()->getCtu(i)->initCtu(m_cIlpPic[j], i);
1649        }
1650      }
1651    }
1652
1653    if( m_cVPS.getNumRefLayers( m_layerId ) == 0 )
1654    {
1655      UInt layerIdx = m_cVPS.getLayerIdxInVps( m_layerId );
1656      RepFormat* repFmt = m_cVPS.getVpsRepFormat(m_cVPS.getVpsRepFormatIdx(layerIdx));
1657     
1658      if( m_cPPS.getLayerId() == 0 && 
1659          m_cSPS.getLayerId() == 0 &&
1660          repFmt->getChromaFormatVpsIdc() == m_cSPS.getChromaFormatIdc() &&
1661          repFmt->getSeparateColourPlaneVpsFlag() == 0 &&
1662          repFmt->getPicHeightVpsInLumaSamples() == m_cSPS.getPicHeightInLumaSamples() &&
1663          repFmt->getPicWidthVpsInLumaSamples()  == m_cSPS.getPicWidthInLumaSamples() &&
1664          repFmt->getBitDepthVpsLuma()   == m_cSPS.getBitDepth(CHANNEL_TYPE_LUMA) &&
1665          repFmt->getBitDepthVpsChroma() == m_cSPS.getBitDepth(CHANNEL_TYPE_CHROMA) &&
1666          repFmt->getConformanceWindowVps().getWindowLeftOffset()   == m_cSPS.getConformanceWindow().getWindowLeftOffset() &&
1667          repFmt->getConformanceWindowVps().getWindowRightOffset()  == m_cSPS.getConformanceWindow().getWindowRightOffset() &&
1668          repFmt->getConformanceWindowVps().getWindowTopOffset()    == m_cSPS.getConformanceWindow().getWindowTopOffset() &&
1669          repFmt->getConformanceWindowVps().getWindowBottomOffset() == m_cSPS.getConformanceWindow().getWindowBottomOffset() )
1670      {
1671        m_cVPS.setBaseLayerPSCompatibilityFlag(layerIdx, 1);
1672      }
1673      else
1674      {
1675        m_cVPS.setBaseLayerPSCompatibilityFlag(layerIdx, 0);
1676      }
1677    }
1678  }
1679}
1680
1681Window TEncTop::getScaledRefLayerWindowForLayer(Int layerId)
1682{
1683  for (Int i = 0; i < m_numRefLayerLocationOffsets; i++)
1684  {
1685    if (layerId == m_refLocationOffsetLayerId[i])
1686    {
1687      return m_scaledRefLayerWindow[i];
1688    }
1689  }
1690
1691  return Window();
1692}
1693
1694Window TEncTop::getRefLayerWindowForLayer(Int layerId)
1695{
1696  for (Int i = 0; i < m_numRefLayerLocationOffsets; i++)
1697  {
1698    if (layerId == m_refLayerId[i])
1699    {
1700      return m_refLayerWindow[i];
1701    }
1702  }
1703
1704  return Window();
1705}
1706#endif //SVC_EXTENSION
1707//! \}
Note: See TracBrowser for help on using the repository browser.