source: SHVCSoftware/branches/SHM-upgrade/source/Lib/TLibEncoder/TEncTop.cpp @ 1311

Last change on this file since 1311 was 1019, checked in by seregin, 10 years ago

fix compile warning

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