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

Last change on this file since 1550 was 1549, checked in by seregin, 9 years ago

port rev 4732, update copyright notice to include 2016

  • Property svn:eol-style set to native
File size: 60.9 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-2016, 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, (Int)( (Double)m_iFrameRate/m_temporalSubsampleRatio + 0.5), 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  if (getTemporalSubsampleRatio()>1)
1109  {
1110    UInt temporalSubsampleRatio = getTemporalSubsampleRatio();
1111    if ( Double(timingInfo->getNumUnitsInTick()) * temporalSubsampleRatio > std::numeric_limits<UInt>::max() )
1112    {
1113      timingInfo->setTimeScale( timingInfo->getTimeScale() / temporalSubsampleRatio );
1114    }
1115    else
1116    {
1117      timingInfo->setNumUnitsInTick( timingInfo->getNumUnitsInTick() * temporalSubsampleRatio );
1118    }
1119  }
1120
1121  Bool rateCnt = ( bitRate > 0 );
1122  hrd->setNalHrdParametersPresentFlag( rateCnt );
1123  hrd->setVclHrdParametersPresentFlag( rateCnt );
1124  hrd->setSubPicCpbParamsPresentFlag( useSubCpbParams );
1125
1126  if( hrd->getSubPicCpbParamsPresentFlag() )
1127  {
1128    hrd->setTickDivisorMinus2( 100 - 2 );                          //
1129    hrd->setDuCpbRemovalDelayLengthMinus1( 7 );                    // 8-bit precision ( plus 1 for last DU in AU )
1130    hrd->setSubPicCpbParamsInPicTimingSEIFlag( true );
1131    hrd->setDpbOutputDelayDuLengthMinus1( 5 + 7 );                 // With sub-clock tick factor of 100, at least 7 bits to have the same value as AU dpb delay
1132  }
1133  else
1134  {
1135    hrd->setSubPicCpbParamsInPicTimingSEIFlag( false );
1136  }
1137
1138#if U0132_TARGET_BITS_SATURATION
1139  if (calcScale(bitRate) <= 6)
1140  {
1141    hrd->setBitRateScale(0);
1142  }
1143  else
1144  {
1145    hrd->setBitRateScale(calcScale(bitRate) - 6);
1146  }
1147
1148  if (calcScale(cpbSize) <= 4)
1149  {
1150    hrd->setCpbSizeScale(0);
1151  }
1152  else
1153  {
1154    hrd->setCpbSizeScale(calcScale(cpbSize) - 4);
1155  }
1156#else
1157  hrd->setBitRateScale( 4 );                                       // in units of 2^( 6 + 4 ) = 1,024 bps
1158  hrd->setCpbSizeScale( 6 );                                       // in units of 2^( 4 + 6 ) = 1,024 bit
1159#endif
1160
1161  hrd->setDuCpbSizeScale( 6 );                                     // in units of 2^( 4 + 6 ) = 1,024 bit
1162
1163  hrd->setInitialCpbRemovalDelayLengthMinus1(15);                  // assuming 0.5 sec, log2( 90,000 * 0.5 ) = 16-bit
1164  if( isRandomAccess )
1165  {
1166    hrd->setCpbRemovalDelayLengthMinus1(5);                        // 32 = 2^5 (plus 1)
1167    hrd->setDpbOutputDelayLengthMinus1 (5);                        // 32 + 3 = 2^6
1168  }
1169  else
1170  {
1171    hrd->setCpbRemovalDelayLengthMinus1(9);                        // max. 2^10
1172    hrd->setDpbOutputDelayLengthMinus1 (9);                        // max. 2^10
1173  }
1174
1175  // Note: parameters for all temporal layers are initialized with the same values
1176  Int i, j;
1177  UInt bitrateValue, cpbSizeValue;
1178  UInt duCpbSizeValue;
1179  UInt duBitRateValue = 0;
1180
1181  for( i = 0; i < MAX_TLAYER; i ++ )
1182  {
1183    hrd->setFixedPicRateFlag( i, 1 );
1184    hrd->setPicDurationInTcMinus1( i, 0 );
1185    hrd->setLowDelayHrdFlag( i, 0 );
1186    hrd->setCpbCntMinus1( i, 0 );
1187
1188    //! \todo check for possible PTL violations
1189    // BitRate[ i ] = ( bit_rate_value_minus1[ i ] + 1 ) * 2^( 6 + bit_rate_scale )
1190    bitrateValue = bitRate / (1 << (6 + hrd->getBitRateScale()) );      // bitRate is in bits, so it needs to be scaled down
1191    // CpbSize[ i ] = ( cpb_size_value_minus1[ i ] + 1 ) * 2^( 4 + cpb_size_scale )
1192#if U0132_TARGET_BITS_SATURATION
1193    cpbSizeValue = cpbSize / (1 << (4 + hrd->getCpbSizeScale()) );      // using bitRate results in 1 second CPB size
1194#else
1195    cpbSizeValue = bitRate / (1 << (4 + hrd->getCpbSizeScale()) );      // using bitRate results in 1 second CPB size
1196#endif
1197
1198
1199    // DU CPB size could be smaller (i.e. bitrateValue / number of DUs), but we don't know
1200    // in how many DUs the slice segment settings will result
1201    duCpbSizeValue = bitrateValue;
1202    duBitRateValue = cpbSizeValue;
1203
1204    for( j = 0; j < ( hrd->getCpbCntMinus1( i ) + 1 ); j ++ )
1205    {
1206      hrd->setBitRateValueMinus1( i, j, 0, ( bitrateValue - 1 ) );
1207      hrd->setCpbSizeValueMinus1( i, j, 0, ( cpbSizeValue - 1 ) );
1208      hrd->setDuCpbSizeValueMinus1( i, j, 0, ( duCpbSizeValue - 1 ) );
1209      hrd->setDuBitRateValueMinus1( i, j, 0, ( duBitRateValue - 1 ) );
1210      hrd->setCbrFlag( i, j, 0, false );
1211
1212      hrd->setBitRateValueMinus1( i, j, 1, ( bitrateValue - 1) );
1213      hrd->setCpbSizeValueMinus1( i, j, 1, ( cpbSizeValue - 1 ) );
1214      hrd->setDuCpbSizeValueMinus1( i, j, 1, ( duCpbSizeValue - 1 ) );
1215      hrd->setDuBitRateValueMinus1( i, j, 1, ( duBitRateValue - 1 ) );
1216      hrd->setCbrFlag( i, j, 1, false );
1217    }
1218  }
1219}
1220
1221Void TEncTop::xInitPPS()
1222{
1223  m_cPPS.setConstrainedIntraPred( m_bUseConstrainedIntraPred );
1224  Bool bUseDQP = (getMaxCuDQPDepth() > 0)? true : false;
1225
1226  if((getMaxDeltaQP() != 0 )|| getUseAdaptiveQP())
1227  {
1228    bUseDQP = true;
1229  }
1230
1231  if (m_costMode==COST_SEQUENCE_LEVEL_LOSSLESS || m_costMode==COST_LOSSLESS_CODING)
1232  {
1233    bUseDQP=false;
1234  }
1235
1236
1237  if ( m_RCEnableRateControl )
1238  {
1239    m_cPPS.setUseDQP(true);
1240    m_cPPS.setMaxCuDQPDepth( 0 );
1241  }
1242  else if(bUseDQP)
1243  {
1244    m_cPPS.setUseDQP(true);
1245    m_cPPS.setMaxCuDQPDepth( m_iMaxCuDQPDepth );
1246  }
1247  else
1248  {
1249    m_cPPS.setUseDQP(false);
1250    m_cPPS.setMaxCuDQPDepth( 0 );
1251  }
1252
1253  if ( m_diffCuChromaQpOffsetDepth >= 0 )
1254  {
1255    m_cPPS.getPpsRangeExtension().setDiffCuChromaQpOffsetDepth(m_diffCuChromaQpOffsetDepth);
1256    m_cPPS.getPpsRangeExtension().clearChromaQpOffsetList();
1257    m_cPPS.getPpsRangeExtension().setChromaQpOffsetListEntry(1, 6, 6);
1258    /* todo, insert table entries from command line (NB, 0 should not be touched) */
1259  }
1260  else
1261  {
1262    m_cPPS.getPpsRangeExtension().setDiffCuChromaQpOffsetDepth(0);
1263    m_cPPS.getPpsRangeExtension().clearChromaQpOffsetList();
1264  }
1265  m_cPPS.getPpsRangeExtension().setCrossComponentPredictionEnabledFlag(m_crossComponentPredictionEnabledFlag);
1266  m_cPPS.getPpsRangeExtension().setLog2SaoOffsetScale(CHANNEL_TYPE_LUMA,   m_log2SaoOffsetScale[CHANNEL_TYPE_LUMA  ]);
1267  m_cPPS.getPpsRangeExtension().setLog2SaoOffsetScale(CHANNEL_TYPE_CHROMA, m_log2SaoOffsetScale[CHANNEL_TYPE_CHROMA]);
1268
1269  m_cPPS.setQpOffset(COMPONENT_Cb, m_chromaCbQpOffset );
1270  m_cPPS.setQpOffset(COMPONENT_Cr, m_chromaCrQpOffset );
1271#if W0038_CQP_ADJ
1272  Bool bChromaDeltaQPEnabled = false;
1273  {
1274    bChromaDeltaQPEnabled = ( m_sliceChromaQpOffsetIntraOrPeriodic[0] || m_sliceChromaQpOffsetIntraOrPeriodic[1] );
1275    if( !bChromaDeltaQPEnabled )
1276    {
1277      for( Int i=0; i<m_iGOPSize; i++ )
1278      {
1279        if( m_GOPList[i].m_CbQPoffset || m_GOPList[i].m_CrQPoffset )
1280        {
1281          bChromaDeltaQPEnabled = true;
1282          break;
1283        }
1284      }
1285    }
1286  }
1287  m_cPPS.setSliceChromaQpFlag(bChromaDeltaQPEnabled);
1288#endif
1289
1290  m_cPPS.setEntropyCodingSyncEnabledFlag( m_entropyCodingSyncEnabledFlag );
1291  m_cPPS.setTilesEnabledFlag( (m_iNumColumnsMinus1 > 0 || m_iNumRowsMinus1 > 0) );
1292  m_cPPS.setUseWP( m_useWeightedPred );
1293  m_cPPS.setWPBiPred( m_useWeightedBiPred );
1294  m_cPPS.setOutputFlagPresentFlag( false );
1295  m_cPPS.setSignHideFlag(getSignHideFlag());
1296
1297  if ( getDeblockingFilterMetric() )
1298  {
1299    m_cPPS.setDeblockingFilterOverrideEnabledFlag(true);
1300    m_cPPS.setPicDisableDeblockingFilterFlag(false);
1301  }
1302  else
1303  {
1304    m_cPPS.setDeblockingFilterOverrideEnabledFlag( !getLoopFilterOffsetInPPS() );
1305    m_cPPS.setPicDisableDeblockingFilterFlag( getLoopFilterDisable() );
1306  }
1307
1308  if (! m_cPPS.getPicDisableDeblockingFilterFlag())
1309  {
1310    m_cPPS.setDeblockingFilterBetaOffsetDiv2( getLoopFilterBetaOffset() );
1311    m_cPPS.setDeblockingFilterTcOffsetDiv2( getLoopFilterTcOffset() );
1312  }
1313  else
1314  {
1315    m_cPPS.setDeblockingFilterBetaOffsetDiv2(0);
1316    m_cPPS.setDeblockingFilterTcOffsetDiv2(0);
1317  }
1318
1319  // deblockingFilterControlPresentFlag is true if any of the settings differ from the inferred values:
1320  const Bool deblockingFilterControlPresentFlag = m_cPPS.getDeblockingFilterOverrideEnabledFlag() ||
1321                                                  m_cPPS.getPicDisableDeblockingFilterFlag()      ||
1322                                                  m_cPPS.getDeblockingFilterBetaOffsetDiv2() != 0 ||
1323                                                  m_cPPS.getDeblockingFilterTcOffsetDiv2() != 0;
1324
1325  m_cPPS.setDeblockingFilterControlPresentFlag(deblockingFilterControlPresentFlag);
1326
1327  m_cPPS.setLog2ParallelMergeLevelMinus2   (m_log2ParallelMergeLevelMinus2 );
1328  m_cPPS.setCabacInitPresentFlag(CABAC_INIT_PRESENT_FLAG);
1329  m_cPPS.setLoopFilterAcrossSlicesEnabledFlag( m_bLFCrossSliceBoundaryFlag );
1330
1331
1332  Int histogram[MAX_NUM_REF + 1];
1333  for( Int i = 0; i <= MAX_NUM_REF; i++ )
1334  {
1335    histogram[i]=0;
1336  }
1337  for( Int i = 0; i < getGOPSize(); i++)
1338  {
1339    assert(getGOPEntry(i).m_numRefPicsActive >= 0 && getGOPEntry(i).m_numRefPicsActive <= MAX_NUM_REF);
1340    histogram[getGOPEntry(i).m_numRefPicsActive]++;
1341  }
1342
1343  Int maxHist=-1;
1344  Int bestPos=0;
1345  for( Int i = 0; i <= MAX_NUM_REF; i++ )
1346  {
1347    if(histogram[i]>maxHist)
1348    {
1349      maxHist=histogram[i];
1350      bestPos=i;
1351    }
1352  }
1353  assert(bestPos <= 15);
1354  m_cPPS.setNumRefIdxL0DefaultActive(bestPos);
1355  m_cPPS.setNumRefIdxL1DefaultActive(bestPos);
1356  m_cPPS.setTransquantBypassEnableFlag(getTransquantBypassEnableFlag());
1357  m_cPPS.setUseTransformSkip( m_useTransformSkip );
1358  m_cPPS.getPpsRangeExtension().setLog2MaxTransformSkipBlockSize( m_log2MaxTransformSkipBlockSize  );
1359
1360  if (m_sliceSegmentMode != NO_SLICES)
1361  {
1362    m_cPPS.setDependentSliceSegmentsEnabledFlag( true );
1363  }
1364 
1365#if SVC_EXTENSION
1366  m_cPPS.setLayerId( m_layerId );
1367
1368  if( !m_numDirectRefLayers && m_numAddLayerSets )
1369  {
1370    m_cPPS.setLayerId(0); // layer ID 0 for independent layers
1371  }
1372
1373  if( m_layerId > 0 )
1374  {
1375    m_cPPS.setListsModificationPresentFlag(true);
1376    m_cPPS.setExtensionFlag(true);
1377  }
1378  else
1379  {
1380    m_cPPS.setListsModificationPresentFlag(false);
1381    m_cPPS.setExtensionFlag(false);
1382  }
1383
1384  m_cPPS.setPPSId( m_iPPSIdCnt );
1385  m_cPPS.setSPSId( m_iSPSIdCnt );
1386
1387  if( m_crossLayerBLAFlag )
1388  {
1389    m_cPPS.setNumExtraSliceHeaderBits( 3 );
1390  }
1391
1392  m_cPPS.setNumRefLayerLocationOffsets(m_numRefLayerLocationOffsets);
1393  for(Int i = 0; i < m_cPPS.getNumRefLayerLocationOffsets(); i++)
1394  {
1395    m_cPPS.setRefLocationOffsetLayerId(i, m_refLocationOffsetLayerId[i]);
1396    m_cPPS.getScaledRefLayerWindow(i) = m_scaledRefLayerWindow[i];
1397    m_cPPS.getRefLayerWindow(i) = m_refLayerWindow[i];
1398    m_cPPS.setScaledRefLayerOffsetPresentFlag( i, m_scaledRefLayerOffsetPresentFlag[i] );
1399    m_cPPS.setRefRegionOffsetPresentFlag( i, m_refRegionOffsetPresentFlag[i] );
1400    m_cPPS.setResamplePhaseSetPresentFlag( i, m_resamplePhaseSetPresentFlag[i] );
1401    m_cPPS.setPhaseHorLuma( m_refLocationOffsetLayerId[i], m_phaseHorLuma[i] );
1402    m_cPPS.setPhaseVerLuma( m_refLocationOffsetLayerId[i], m_phaseVerLuma[i] );
1403    m_cPPS.setPhaseHorChroma( m_refLocationOffsetLayerId[i], m_phaseHorChroma[i] );
1404    m_cPPS.setPhaseVerChroma( m_refLocationOffsetLayerId[i], m_phaseVerChroma[i] );
1405  }
1406#if CGS_3D_ASYMLUT
1407  m_cPPS.setCGSFlag( m_nCGSFlag );
1408#endif
1409  m_cPPS.setPocResetInfoPresentFlag( true );
1410  m_cPPS.setExtensionFlag( true );
1411  m_cPPS.setSliceHeaderExtensionPresentFlag( true );
1412#endif //SVC_EXTENSION
1413}
1414
1415//Function for initializing m_RPSList, a list of TComReferencePictureSet, based on the GOPEntry objects read from the config file.
1416Void TEncTop::xInitRPS(Bool isFieldCoding)
1417{
1418  TComReferencePictureSet*      rps;
1419
1420  m_cSPS.createRPSList(getGOPSize() + m_extraRPSs + 1);
1421  TComRPSList* rpsList = m_cSPS.getRPSList();
1422
1423  for( Int i = 0; i < getGOPSize()+m_extraRPSs; i++)
1424  {
1425    GOPEntry ge = getGOPEntry(i);
1426    rps = rpsList->getReferencePictureSet(i);
1427    rps->setNumberOfPictures(ge.m_numRefPics);
1428    rps->setNumRefIdc(ge.m_numRefIdc);
1429    Int numNeg = 0;
1430    Int numPos = 0;
1431    for( Int j = 0; j < ge.m_numRefPics; j++)
1432    {
1433      rps->setDeltaPOC(j,ge.m_referencePics[j]);
1434      rps->setUsed(j,ge.m_usedByCurrPic[j]);
1435      if(ge.m_referencePics[j]>0)
1436      {
1437        numPos++;
1438      }
1439      else
1440      {
1441        numNeg++;
1442      }
1443    }
1444    rps->setNumberOfNegativePictures(numNeg);
1445    rps->setNumberOfPositivePictures(numPos);
1446
1447    // handle inter RPS intialization from the config file.
1448    rps->setInterRPSPrediction(ge.m_interRPSPrediction > 0);  // not very clean, converting anything > 0 to true.
1449    rps->setDeltaRIdxMinus1(0);                               // index to the Reference RPS is always the previous one.
1450    TComReferencePictureSet*     RPSRef = i>0 ? rpsList->getReferencePictureSet(i-1): NULL;  // get the reference RPS
1451
1452    if (ge.m_interRPSPrediction == 2)  // Automatic generation of the inter RPS idc based on the RIdx provided.
1453    {
1454      assert (RPSRef!=NULL);
1455      Int deltaRPS = getGOPEntry(i-1).m_POC - ge.m_POC;  // the ref POC - current POC
1456      Int numRefDeltaPOC = RPSRef->getNumberOfPictures();
1457
1458      rps->setDeltaRPS(deltaRPS);           // set delta RPS
1459      rps->setNumRefIdc(numRefDeltaPOC+1);  // set the numRefIdc to the number of pictures in the reference RPS + 1.
1460      Int count=0;
1461      for (Int j = 0; j <= numRefDeltaPOC; j++ ) // cycle through pics in reference RPS.
1462      {
1463        Int RefDeltaPOC = (j<numRefDeltaPOC)? RPSRef->getDeltaPOC(j): 0;  // if it is the last decoded picture, set RefDeltaPOC = 0
1464        rps->setRefIdc(j, 0);
1465        for (Int k = 0; k < rps->getNumberOfPictures(); k++ )  // cycle through pics in current RPS.
1466        {
1467          if (rps->getDeltaPOC(k) == ( RefDeltaPOC + deltaRPS))  // if the current RPS has a same picture as the reference RPS.
1468          {
1469              rps->setRefIdc(j, (rps->getUsed(k)?1:2));
1470              count++;
1471              break;
1472          }
1473        }
1474      }
1475      if (count != rps->getNumberOfPictures())
1476      {
1477        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");
1478        rps->setInterRPSPrediction(0);
1479      }
1480    }
1481    else if (ge.m_interRPSPrediction == 1)  // inter RPS idc based on the RefIdc values provided in config file.
1482    {
1483      assert (RPSRef!=NULL);
1484      rps->setDeltaRPS(ge.m_deltaRPS);
1485      rps->setNumRefIdc(ge.m_numRefIdc);
1486      for (Int j = 0; j < ge.m_numRefIdc; j++ )
1487      {
1488        rps->setRefIdc(j, ge.m_refIdc[j]);
1489      }
1490      // the following code overwrite the deltaPOC and Used by current values read from the config file with the ones
1491      // computed from the RefIdc.  A warning is printed if they are not identical.
1492      numNeg = 0;
1493      numPos = 0;
1494      TComReferencePictureSet      RPSTemp;  // temporary variable
1495
1496      for (Int j = 0; j < ge.m_numRefIdc; j++ )
1497      {
1498        if (ge.m_refIdc[j])
1499        {
1500          Int deltaPOC = ge.m_deltaRPS + ((j < RPSRef->getNumberOfPictures())? RPSRef->getDeltaPOC(j) : 0);
1501          RPSTemp.setDeltaPOC((numNeg+numPos),deltaPOC);
1502          RPSTemp.setUsed((numNeg+numPos),ge.m_refIdc[j]==1?1:0);
1503          if (deltaPOC<0)
1504          {
1505            numNeg++;
1506          }
1507          else
1508          {
1509            numPos++;
1510          }
1511        }
1512      }
1513      if (numNeg != rps->getNumberOfNegativePictures())
1514      {
1515        printf("Warning: number of negative pictures in RPS is different between intra and inter RPS specified in the config file.\n");
1516        rps->setNumberOfNegativePictures(numNeg);
1517        rps->setNumberOfPictures(numNeg+numPos);
1518      }
1519      if (numPos != rps->getNumberOfPositivePictures())
1520      {
1521        printf("Warning: number of positive pictures in RPS is different between intra and inter RPS specified in the config file.\n");
1522        rps->setNumberOfPositivePictures(numPos);
1523        rps->setNumberOfPictures(numNeg+numPos);
1524      }
1525      RPSTemp.setNumberOfPictures(numNeg+numPos);
1526      RPSTemp.setNumberOfNegativePictures(numNeg);
1527      RPSTemp.sortDeltaPOC();     // sort the created delta POC before comparing
1528      // check if Delta POC and Used are the same
1529      // print warning if they are not.
1530      for (Int j = 0; j < ge.m_numRefIdc; j++ )
1531      {
1532        if (RPSTemp.getDeltaPOC(j) != rps->getDeltaPOC(j))
1533        {
1534          printf("Warning: delta POC is different between intra RPS and inter RPS specified in the config file.\n");
1535          rps->setDeltaPOC(j,RPSTemp.getDeltaPOC(j));
1536        }
1537        if (RPSTemp.getUsed(j) != rps->getUsed(j))
1538        {
1539          printf("Warning: Used by Current in RPS is different between intra and inter RPS specified in the config file.\n");
1540          rps->setUsed(j,RPSTemp.getUsed(j));
1541        }
1542      }
1543    }
1544  }
1545  //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.
1546  //The position = GOPSize + extraRPSs which is (a priori) unused is reserved for this field in the RPS.
1547  if (isFieldCoding)
1548  {
1549    rps = rpsList->getReferencePictureSet(getGOPSize()+m_extraRPSs);
1550    rps->setNumberOfPictures(1);
1551    rps->setNumberOfNegativePictures(1);
1552    rps->setNumberOfPositivePictures(0);
1553    rps->setNumberOfLongtermPictures(0);
1554    rps->setDeltaPOC(0,-1);
1555    rps->setPOC(0,0);
1556    rps->setUsed(0,true);
1557    rps->setInterRPSPrediction(false);
1558    rps->setDeltaRIdxMinus1(0);
1559    rps->setDeltaRPS(0);
1560    rps->setNumRefIdc(0);
1561  }
1562}
1563
1564   // This is a function that
1565   // determines what Reference Picture Set to use
1566   // for a specific slice (with POC = POCCurr)
1567Void TEncTop::selectReferencePictureSet(TComSlice* slice, Int POCCurr, Int GOPid )
1568{
1569  slice->setRPSidx(GOPid);
1570
1571  for(Int extraNum=m_iGOPSize; extraNum<m_extraRPSs+m_iGOPSize; extraNum++)
1572  {
1573    if(m_uiIntraPeriod > 0 && getDecodingRefreshType() > 0)
1574    {
1575      Int POCIndex = POCCurr%m_uiIntraPeriod;
1576      if(POCIndex == 0)
1577      {
1578        POCIndex = m_uiIntraPeriod;
1579      }
1580      if(POCIndex == m_GOPList[extraNum].m_POC)
1581      {
1582        slice->setRPSidx(extraNum);
1583      }
1584    }
1585    else
1586    {
1587      if(POCCurr==m_GOPList[extraNum].m_POC)
1588      {
1589        slice->setRPSidx(extraNum);
1590      }
1591    }
1592  }
1593
1594  if(POCCurr == 1 && slice->getPic()->isField())
1595  {
1596    slice->setRPSidx(m_iGOPSize+m_extraRPSs);
1597  }
1598
1599  const TComReferencePictureSet *rps = (slice->getSPS()->getRPSList()->getReferencePictureSet(slice->getRPSidx()));
1600  slice->setRPS(rps);
1601}
1602
1603Int TEncTop::getReferencePictureSetIdxForSOP(Int POCCurr, Int GOPid )
1604{
1605  Int rpsIdx = GOPid;
1606
1607  for(Int extraNum=m_iGOPSize; extraNum<m_extraRPSs+m_iGOPSize; extraNum++)
1608  {
1609    if(m_uiIntraPeriod > 0 && getDecodingRefreshType() > 0)
1610    {
1611      Int POCIndex = POCCurr%m_uiIntraPeriod;
1612      if(POCIndex == 0)
1613      {
1614        POCIndex = m_uiIntraPeriod;
1615      }
1616      if(POCIndex == m_GOPList[extraNum].m_POC)
1617      {
1618        rpsIdx = extraNum;
1619      }
1620    }
1621    else
1622    {
1623      if(POCCurr==m_GOPList[extraNum].m_POC)
1624      {
1625        rpsIdx = extraNum;
1626      }
1627    }
1628  }
1629
1630  return rpsIdx;
1631}
1632
1633Void  TEncTop::xInitPPSforTiles()
1634{
1635  m_cPPS.setTileUniformSpacingFlag( m_tileUniformSpacingFlag );
1636  m_cPPS.setNumTileColumnsMinus1( m_iNumColumnsMinus1 );
1637  m_cPPS.setNumTileRowsMinus1( m_iNumRowsMinus1 );
1638  if( !m_tileUniformSpacingFlag )
1639  {
1640    m_cPPS.setTileColumnWidth( m_tileColumnWidth );
1641    m_cPPS.setTileRowHeight( m_tileRowHeight );
1642  }
1643  m_cPPS.setLoopFilterAcrossTilesEnabledFlag( m_loopFilterAcrossTilesEnabledFlag );
1644
1645  // # substreams is "per tile" when tiles are independent.
1646}
1647
1648Void  TEncCfg::xCheckGSParameters()
1649{
1650  Int   iWidthInCU = ( m_iSourceWidth%m_maxCUWidth ) ? m_iSourceWidth/m_maxCUWidth + 1 : m_iSourceWidth/m_maxCUWidth;
1651  Int   iHeightInCU = ( m_iSourceHeight%m_maxCUHeight ) ? m_iSourceHeight/m_maxCUHeight + 1 : m_iSourceHeight/m_maxCUHeight;
1652  UInt  uiCummulativeColumnWidth = 0;
1653  UInt  uiCummulativeRowHeight = 0;
1654
1655  //check the column relative parameters
1656  if( m_iNumColumnsMinus1 >= (1<<(LOG2_MAX_NUM_COLUMNS_MINUS1+1)) )
1657  {
1658    printf( "The number of columns is larger than the maximum allowed number of columns.\n" );
1659    exit( EXIT_FAILURE );
1660  }
1661
1662  if( m_iNumColumnsMinus1 >= iWidthInCU )
1663  {
1664    printf( "The current picture can not have so many columns.\n" );
1665    exit( EXIT_FAILURE );
1666  }
1667
1668  if( m_iNumColumnsMinus1 && !m_tileUniformSpacingFlag )
1669  {
1670    for(Int i=0; i<m_iNumColumnsMinus1; i++)
1671    {
1672      uiCummulativeColumnWidth += m_tileColumnWidth[i];
1673    }
1674
1675    if( uiCummulativeColumnWidth >= iWidthInCU )
1676    {
1677      printf( "The width of the column is too large.\n" );
1678      exit( EXIT_FAILURE );
1679    }
1680  }
1681
1682  //check the row relative parameters
1683  if( m_iNumRowsMinus1 >= (1<<(LOG2_MAX_NUM_ROWS_MINUS1+1)) )
1684  {
1685    printf( "The number of rows is larger than the maximum allowed number of rows.\n" );
1686    exit( EXIT_FAILURE );
1687  }
1688
1689  if( m_iNumRowsMinus1 >= iHeightInCU )
1690  {
1691    printf( "The current picture can not have so many rows.\n" );
1692    exit( EXIT_FAILURE );
1693  }
1694
1695  if( m_iNumRowsMinus1 && !m_tileUniformSpacingFlag )
1696  {
1697    for(Int i=0; i<m_iNumRowsMinus1; i++)
1698    {
1699      uiCummulativeRowHeight += m_tileRowHeight[i];
1700    }
1701
1702    if( uiCummulativeRowHeight >= iHeightInCU )
1703    {
1704      printf( "The height of the row is too large.\n" );
1705      exit( EXIT_FAILURE );
1706    }
1707  }
1708}
1709
1710#if SVC_EXTENSION
1711TEncTop* TEncTop::getRefLayerEnc( UInt refLayerIdx )
1712{
1713  if( m_ppcTEncTop[m_cVPS.getLayerIdxInVps(m_layerId)]->getNumDirectRefLayers() <= 0 )
1714  {
1715    return (TEncTop *)getLayerEnc( 0 );
1716  }
1717
1718  return (TEncTop *)getLayerEnc( m_cVPS.getLayerIdxInVps(m_cVPS.getRefLayerId( m_layerId, refLayerIdx )) );
1719}
1720
1721Void TEncTop::xInitILRP()
1722{
1723  if( m_layerId > 0 )
1724  {
1725    if( m_cIlpPic[0] == NULL )
1726    {
1727      for (Int j=0; j < m_numDirectRefLayers; j++)
1728      {
1729        m_cIlpPic[j] = new TComPic;
1730        m_cIlpPic[j]->create(m_cSPS, m_cPPS, true, m_layerId);
1731        for (Int i=0; i<m_cIlpPic[j]->getPicSym()->getNumberOfCtusInFrame(); i++)
1732        {
1733          m_cIlpPic[j]->getPicSym()->getCtu(i)->initCtu(m_cIlpPic[j], i);
1734        }
1735      }
1736    }
1737
1738    if( m_cVPS.getNumRefLayers( m_layerId ) == 0 )
1739    {
1740      UInt layerIdx = m_cVPS.getLayerIdxInVps( m_layerId );
1741      RepFormat* repFmt = m_cVPS.getVpsRepFormat(m_cVPS.getVpsRepFormatIdx(layerIdx));
1742     
1743      if( m_cPPS.getLayerId() == 0 && 
1744          m_cSPS.getLayerId() == 0 &&
1745          repFmt->getChromaFormatVpsIdc() == m_cSPS.getChromaFormatIdc() &&
1746          repFmt->getSeparateColourPlaneVpsFlag() == 0 &&
1747          repFmt->getPicHeightVpsInLumaSamples() == m_cSPS.getPicHeightInLumaSamples() &&
1748          repFmt->getPicWidthVpsInLumaSamples()  == m_cSPS.getPicWidthInLumaSamples() &&
1749          repFmt->getBitDepthVpsLuma()   == m_cSPS.getBitDepth(CHANNEL_TYPE_LUMA) &&
1750          repFmt->getBitDepthVpsChroma() == m_cSPS.getBitDepth(CHANNEL_TYPE_CHROMA) &&
1751          repFmt->getConformanceWindowVps().getWindowLeftOffset()   == m_cSPS.getConformanceWindow().getWindowLeftOffset() &&
1752          repFmt->getConformanceWindowVps().getWindowRightOffset()  == m_cSPS.getConformanceWindow().getWindowRightOffset() &&
1753          repFmt->getConformanceWindowVps().getWindowTopOffset()    == m_cSPS.getConformanceWindow().getWindowTopOffset() &&
1754          repFmt->getConformanceWindowVps().getWindowBottomOffset() == m_cSPS.getConformanceWindow().getWindowBottomOffset() )
1755      {
1756        m_cVPS.setBaseLayerPSCompatibilityFlag(layerIdx, 1);
1757      }
1758      else
1759      {
1760        m_cVPS.setBaseLayerPSCompatibilityFlag(layerIdx, 0);
1761      }
1762    }
1763  }
1764}
1765
1766Window TEncTop::getScaledRefLayerWindowForLayer(Int layerId)
1767{
1768  for (Int i = 0; i < m_numRefLayerLocationOffsets; i++)
1769  {
1770    if (layerId == m_refLocationOffsetLayerId[i])
1771    {
1772      return m_scaledRefLayerWindow[i];
1773    }
1774  }
1775
1776  return Window();
1777}
1778
1779Window TEncTop::getRefLayerWindowForLayer(Int layerId)
1780{
1781  for (Int i = 0; i < m_numRefLayerLocationOffsets; i++)
1782  {
1783    if (layerId == m_refLayerId[i])
1784    {
1785      return m_refLayerWindow[i];
1786    }
1787  }
1788
1789  return Window();
1790}
1791#endif //SVC_EXTENSION
1792//! \}
Note: See TracBrowser for help on using the repository browser.