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

Last change on this file since 1535 was 1534, checked in by seregin, 9 years ago

integration of multi-view support from JCTVC-W0134

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