source: SHVCSoftware/branches/SHM-dev/source/App/TAppEncoder/TAppEncTop.cpp @ 1066

Last change on this file since 1066 was 1058, checked in by interdigital, 10 years ago

support simulcast when NumActiveRefLayers is 0

  • Property svn:eol-style set to native
File size: 138.7 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-2014, 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     TAppEncTop.cpp
35    \brief    Encoder application class
36*/
37
38#include <list>
39#include <fstream>
40#include <stdlib.h>
41#include <stdio.h>
42#include <fcntl.h>
43#include <assert.h>
44#if !SVC_EXTENSION
45#include <iomanip>
46#endif
47
48#include "TAppEncTop.h"
49#include "TLibEncoder/AnnexBwrite.h"
50
51using namespace std;
52
53//! \ingroup TAppEncoder
54//! \{
55
56// ====================================================================================================================
57// Constructor / destructor / initialization / destroy
58// ====================================================================================================================
59
60TAppEncTop::TAppEncTop()
61{
62  m_iFrameRcvd = 0;
63  m_totalBytes = 0;
64  m_essentialBytes = 0;
65#if SVC_EXTENSION
66  for(UInt layer=0; layer < MAX_LAYERS; layer++)
67  {
68    m_apcTEncTop[layer] = &m_acTEncTop[layer];
69  }
70#endif
71}
72
73TAppEncTop::~TAppEncTop()
74{
75}
76
77#if SVC_EXTENSION
78Void TAppEncTop::xInitLibCfg()
79{
80  TComVPS* vps = m_acTEncTop[0].getVPS();
81
82#if P0297_VPS_POC_LSB_ALIGNED_FLAG
83  vps->setVpsPocLsbAlignedFlag(false);
84#endif
85  vps->setMaxTLayers                                                      ( m_maxTempLayer );
86  if (m_maxTempLayer == 1)
87  {
88    vps->setTemporalNestingFlag(true);
89  }
90  for(Int i = 0; i < MAX_TLAYER; i++)
91  {
92    vps->setNumReorderPics                                                ( m_numReorderPics[i], i );
93    vps->setMaxDecPicBuffering                                            ( m_maxDecPicBuffering[i], i );
94  }
95
96#if REPN_FORMAT_IN_VPS 
97  Int maxRepFormatIdx = -1;
98  Int formatIdx = -1;
99  for(UInt layer=0; layer < m_numLayers; layer++)
100  {
101    // Auto generation of the format index
102    if( m_acLayerCfg[layer].getRepFormatIdx() == -1 )
103    {     
104      Bool found = false;
105      for( UInt idx = 0; idx < layer; idx++ )
106      {
107        if( m_acLayerCfg[layer].getSourceWidth() == m_acLayerCfg[idx].getSourceWidth() && m_acLayerCfg[layer].getSourceHeight() == m_acLayerCfg[idx].getSourceHeight()
108#if AUXILIARY_PICTURES
109          && m_acLayerCfg[layer].getChromaFormatIDC() == m_acLayerCfg[idx].getChromaFormatIDC()
110#endif
111#if O0194_DIFFERENT_BITDEPTH_EL_BL
112          && m_acLayerCfg[layer].m_internalBitDepth[CHANNEL_TYPE_LUMA] == m_acLayerCfg[idx].m_internalBitDepth[CHANNEL_TYPE_LUMA] && m_acLayerCfg[layer].m_internalBitDepth[CHANNEL_TYPE_CHROMA] == m_acLayerCfg[idx].m_internalBitDepth[CHANNEL_TYPE_CHROMA]
113#endif
114          )
115        {
116          found = true;
117          break;
118        }
119      }
120      if( !found )
121      {
122        formatIdx++;
123      }
124
125      m_acLayerCfg[layer].setRepFormatIdx( formatIdx );
126    }
127
128    assert( m_acLayerCfg[layer].getRepFormatIdx() != -1 && "RepFormatIdx not assigned for a layer" );
129
130    vps->setVpsRepFormatIdx( layer, m_acLayerCfg[layer].getRepFormatIdx() );
131
132    maxRepFormatIdx = std::max( m_acLayerCfg[layer].getRepFormatIdx(), maxRepFormatIdx );
133  }
134
135  assert( vps->getVpsRepFormatIdx( 0 ) == 0 );  // Base layer should point to the first one.
136
137  Int* mapIdxToLayer = new Int[maxRepFormatIdx + 1];
138
139  // Check that all the indices from 0 to maxRepFormatIdx are used in the VPS
140  for(Int i = 0; i <= maxRepFormatIdx; i++)
141  {
142    mapIdxToLayer[i] = -1;
143    UInt layer;
144    for(layer=0; layer < m_numLayers; layer++)
145    {
146      if( vps->getVpsRepFormatIdx(layer) == i )
147      {
148        mapIdxToLayer[i] = layer;
149        break;
150      }
151    }
152    assert( layer != m_numLayers );   // One of the VPS Rep format indices not set
153  }
154
155  vps->setVpsNumRepFormats                                                ( maxRepFormatIdx + 1 );
156
157#if Q0195_REP_FORMAT_CLEANUP
158  // When not present, the value of rep_format_idx_present_flag is inferred to be equal to 0
159  vps->setRepFormatIdxPresentFlag                                         ( vps->getVpsNumRepFormats() > 1 ? true : false );
160#else
161  vps->setRepFormatIdxPresentFlag                                         ( true );
162#endif
163
164  for(UInt idx=0; idx < vps->getVpsNumRepFormats(); idx++)
165  {
166    RepFormat *repFormat = vps->getVpsRepFormat( idx );
167#if REPN_FORMAT_CONTROL_FLAG
168    repFormat->setChromaAndBitDepthVpsPresentFlag                         ( true ); 
169    if (idx==0)
170    {
171      assert(repFormat->getChromaAndBitDepthVpsPresentFlag() == true); 
172    }
173#endif
174    repFormat->setPicWidthVpsInLumaSamples                                ( m_acLayerCfg[mapIdxToLayer[idx]].getSourceWidth()   );
175    repFormat->setPicHeightVpsInLumaSamples                               ( m_acLayerCfg[mapIdxToLayer[idx]].getSourceHeight()  );
176#if AUXILIARY_PICTURES
177    repFormat->setChromaFormatVpsIdc                                      ( m_acLayerCfg[mapIdxToLayer[idx]].getChromaFormatIDC() );
178#else
179    repFormat->setChromaFormatVpsIdc                                      ( 1 );  // Need modification to change for each layer - corresponds to 420
180#endif
181    repFormat->setSeparateColourPlaneVpsFlag                              ( 0 );  // Need modification to change for each layer
182#if O0194_DIFFERENT_BITDEPTH_EL_BL
183    repFormat->setBitDepthVpsLuma                                         ( getInternalBitDepth(mapIdxToLayer[idx], CHANNEL_TYPE_LUMA)      );  // Need modification to change for each layer
184    repFormat->setBitDepthVpsChroma                                       ( getInternalBitDepth(mapIdxToLayer[idx], CHANNEL_TYPE_CHROMA)    );  // Need modification to change for each layer
185#else
186    repFormat->setBitDepthVpsLuma                                         ( getInternalBitDepth(CHANNEL_TYPE_LUMA)                        );  // Need modification to change for each layer
187    repFormat->setBitDepthVpsChroma                                       ( getInternalBitDepth(CHANNEL_TYPE_CHROMA)                      );  // Need modification to change for each layer
188#endif
189
190#if R0156_CONF_WINDOW_IN_REP_FORMAT
191    repFormat->getConformanceWindowVps().setWindow                        ( m_acLayerCfg[mapIdxToLayer[idx]].m_confWinLeft,                                                                             
192                                                                            m_acLayerCfg[mapIdxToLayer[idx]].m_confWinRight, 
193                                                                            m_acLayerCfg[mapIdxToLayer[idx]].m_confWinTop,
194                                                                            m_acLayerCfg[mapIdxToLayer[idx]].m_confWinBottom );
195#endif
196
197#if HIGHER_LAYER_IRAP_SKIP_FLAG
198    m_acTEncTop[mapIdxToLayer[idx]].setSkipPictureAtArcSwitch             ( m_skipPictureAtArcSwitch );
199#endif
200  }
201  delete [] mapIdxToLayer;
202#endif
203
204#if MULTIPLE_PTL_SUPPORT
205  //Populate PTL in VPS
206  TComVPS *pVPS = m_acTEncTop[0].getVPS();
207  for( Int ii = 0; ii < m_numPTLInfo; ii++ )
208  {
209    pVPS->getPTL(ii)->getGeneralPTL()->setLevelIdc(m_levelList[ii]);
210    pVPS->getPTL(ii)->getGeneralPTL()->setTierFlag(m_levelTierList[ii]);
211    pVPS->getPTL(ii)->getGeneralPTL()->setProfileIdc(m_profileList[ii]);
212    pVPS->getPTL(ii)->getGeneralPTL()->setProfileCompatibilityFlag(m_profileCompatibility[ii], 1);
213    pVPS->getPTL(ii)->getGeneralPTL()->setProgressiveSourceFlag(m_progressiveSourceFlagList[ii]);
214    pVPS->getPTL(ii)->getGeneralPTL()->setInterlacedSourceFlag(m_interlacedSourceFlagList[ii]);
215    pVPS->getPTL(ii)->getGeneralPTL()->setNonPackedConstraintFlag(m_nonPackedConstraintFlagList[ii]);
216    pVPS->getPTL(ii)->getGeneralPTL()->setFrameOnlyConstraintFlag(m_frameOnlyConstraintFlagList[ii]);
217  }
218  pVPS->setNumProfileTierLevel(m_numPTLInfo);
219
220  std::vector<int> myvector;
221  vps->getProfileLevelTierIdx()->resize(m_numOutputLayerSets);
222  for (int ii = 0; ii < m_numOutputLayerSets; ii++)
223  {
224    myvector =  m_listOfLayerPTLofOlss[ii];
225
226    for (std::vector<int>::iterator it = myvector.begin() ; it != myvector.end(); ++it)
227    {
228      pVPS->addProfileLevelTierIdx(ii, it[0]);
229    }
230  }
231#endif
232
233  assert( m_numLayers <= MAX_LAYERS );
234
235  for(UInt layer=0; layer<m_numLayers; layer++)
236  {
237#if O0194_DIFFERENT_BITDEPTH_EL_BL
238    //1
239    g_bitDepth[CHANNEL_TYPE_LUMA]   = m_acLayerCfg[layer].m_internalBitDepth[CHANNEL_TYPE_LUMA];
240    g_bitDepth[CHANNEL_TYPE_CHROMA] = m_acLayerCfg[layer].m_internalBitDepth[CHANNEL_TYPE_CHROMA];
241
242    g_PCMBitDepth[CHANNEL_TYPE_LUMA]   = m_bPCMInputBitDepthFlag ? m_acLayerCfg[layer].m_inputBitDepth[CHANNEL_TYPE_LUMA]   : m_acLayerCfg[layer].m_internalBitDepth[CHANNEL_TYPE_LUMA];
243    g_PCMBitDepth[CHANNEL_TYPE_CHROMA] = m_bPCMInputBitDepthFlag ? m_acLayerCfg[layer].m_inputBitDepth[CHANNEL_TYPE_CHROMA] : m_acLayerCfg[layer].m_internalBitDepth[CHANNEL_TYPE_CHROMA];
244
245    // Set this to be used in Upsampling filter in function "TComUpsampleFilter::upsampleBasePic"
246    g_bitDepthLayer[CHANNEL_TYPE_LUMA][layer]   = g_bitDepth[CHANNEL_TYPE_LUMA];
247    g_bitDepthLayer[CHANNEL_TYPE_CHROMA][layer] = g_bitDepth[CHANNEL_TYPE_CHROMA];
248
249#if O0194_WEIGHTED_PREDICTION_CGS
250    m_acTEncTop[layer].setInterLayerWeightedPredFlag                      ( m_useInterLayerWeightedPred );
251#endif
252#endif
253   
254#if MULTIPLE_PTL_SUPPORT
255    Int layerPTLIdx = m_acLayerCfg[layer].m_layerPTLIdx;
256    m_acTEncTop[layer].setProfile                                         ( m_profileList[layerPTLIdx] );
257    m_acTEncTop[layer].setLevel                                           ( m_levelTierList[layerPTLIdx], m_levelList[layerPTLIdx] );
258    m_acTEncTop[layer].setProgressiveSourceFlag                           ( m_progressiveSourceFlagList[layerPTLIdx] );
259    m_acTEncTop[layer].setInterlacedSourceFlag                            ( m_interlacedSourceFlagList[layerPTLIdx] );
260    m_acTEncTop[layer].setNonPackedConstraintFlag                         ( m_nonPackedConstraintFlagList[layerPTLIdx] );
261    m_acTEncTop[layer].setFrameOnlyConstraintFlag                         ( m_frameOnlyConstraintFlagList[layerPTLIdx] );
262    m_acTEncTop[layer].setBitDepthConstraintValue                         ( m_acLayerCfg[layer].m_bitDepthConstraint );
263    m_acTEncTop[layer].setChromaFormatConstraintValue                     ( m_acLayerCfg[layer].m_chromaFormatConstraint );
264    m_acTEncTop[layer].setIntraConstraintFlag                             ( m_acLayerCfg[layer].m_intraConstraintFlag );
265    m_acTEncTop[layer].setLowerBitRateConstraintFlag                      ( m_acLayerCfg[layer].m_lowerBitRateConstraintFlag );
266#else
267    m_acTEncTop[layer].setProfile                                         ( m_profile );
268    m_acTEncTop[layer].setLevel                                           ( m_levelTier, m_level );
269    m_acTEncTop[layer].setProgressiveSourceFlag                           ( m_progressiveSourceFlag );
270    m_acTEncTop[layer].setInterlacedSourceFlag                            ( m_interlacedSourceFlag );
271    m_acTEncTop[layer].setNonPackedConstraintFlag                         ( m_nonPackedConstraintFlag );
272    m_acTEncTop[layer].setFrameOnlyConstraintFlag                         ( m_frameOnlyConstraintFlag );
273    m_acTEncTop[layer].setBitDepthConstraintValue                         ( m_bitDepthConstraint );
274    m_acTEncTop[layer].setChromaFormatConstraintValue                     ( m_acLayerCfg[layer].m_chromaFormatConstraint );
275    m_acTEncTop[layer].setIntraConstraintFlag                             ( m_intraConstraintFlag );
276    m_acTEncTop[layer].setLowerBitRateConstraintFlag                      ( m_lowerBitRateConstraintFlag );
277#endif
278
279    m_acTEncTop[layer].setPrintMSEBasedSequencePSNR                       ( m_printMSEBasedSequencePSNR);
280    m_acTEncTop[layer].setPrintFrameMSE                                   ( m_printFrameMSE);
281    m_acTEncTop[layer].setPrintSequenceMSE                                ( m_printSequenceMSE);
282    m_acTEncTop[layer].setCabacZeroWordPaddingEnabled                     ( m_cabacZeroWordPaddingEnabled );
283
284    m_acTEncTop[layer].setFrameRate                                       ( m_acLayerCfg[layer].getFrameRate() );
285    m_acTEncTop[layer].setFrameSkip                                       ( m_FrameSkip );
286    m_acTEncTop[layer].setSourceWidth                                     ( m_acLayerCfg[layer].getSourceWidth() );
287    m_acTEncTop[layer].setSourceHeight                                    ( m_acLayerCfg[layer].getSourceHeight() );
288    m_acTEncTop[layer].setConformanceWindow                               ( m_acLayerCfg[layer].m_confWinLeft, m_acLayerCfg[layer].m_confWinRight, m_acLayerCfg[layer].m_confWinTop, m_acLayerCfg[layer].m_confWinBottom );
289    m_acTEncTop[layer].setFramesToBeEncoded                               ( m_framesToBeEncoded );
290
291#if REF_IDX_MFM
292#if AVC_BASE
293#if VPS_AVC_BL_FLAG_REMOVAL
294    m_acTEncTop[layer].setMFMEnabledFlag                                  (layer == 0 ? false : ( m_nonHEVCBaseLayerFlag ? false : true ) && m_acLayerCfg[layer].getNumMotionPredRefLayers());
295#else
296    m_acTEncTop[layer].setMFMEnabledFlag                                  (layer == 0 ? false : ( m_avcBaseLayerFlag ? false : true ) && m_acLayerCfg[layer].getNumMotionPredRefLayers());
297#endif
298#else
299    m_acTEncTop[layer].setMFMEnabledFlag                                  (layer == 0 ? false : ( m_acLayerCfg[layer].getNumMotionPredRefLayers() > 0 ) );
300#endif
301#endif
302    // set layer ID
303    m_acTEncTop[layer].setLayerId                                         ( m_acLayerCfg[layer].m_layerId == -1 ? layer : m_acLayerCfg[layer].m_layerId );
304    m_acTEncTop[layer].setNumLayer                                        ( m_numLayers );
305    m_acTEncTop[layer].setLayerEnc                                        ( m_apcTEncTop );
306
307    //====== Coding Structure ========
308    m_acTEncTop[layer].setIntraPeriod                                     ( m_acLayerCfg[layer].m_iIntraPeriod );
309    m_acTEncTop[layer].setDecodingRefreshType                             ( m_iDecodingRefreshType );
310    m_acTEncTop[layer].setGOPSize                                         ( m_iGOPSize );
311#if Q0108_TSA_STSA
312    m_acTEncTop[layer].setGopList                                         ( layer ? m_EhGOPList[layer] : m_GOPList );
313#else
314    m_acTEncTop[layer].setGopList                                         ( m_GOPList );
315#endif
316
317#if !Q0108_TSA_STSA
318    m_acTEncTop[layer].setExtraRPSs                                       ( m_extraRPSs );
319#else
320    m_acTEncTop[layer].setExtraRPSs                                       ( m_extraRPSs[layer] );
321#endif
322    for(Int i = 0; i < MAX_TLAYER; i++)
323    {
324      m_acTEncTop[layer].setNumReorderPics                                ( m_numReorderPics[i], i );
325      m_acTEncTop[layer].setMaxDecPicBuffering                            ( m_maxDecPicBuffering[i], i );
326    }
327    for( UInt uiLoop = 0; uiLoop < MAX_TLAYER; ++uiLoop )
328    {
329      m_acTEncTop[layer].setLambdaModifier                                ( uiLoop, m_adLambdaModifier[ uiLoop ] );
330    }
331    m_acTEncTop[layer].setQP                                              ( m_acLayerCfg[layer].getIntQP() );
332
333    m_acTEncTop[layer].setPad                                             ( m_acLayerCfg[layer].getPad() );
334#if !Q0108_TSA_STSA
335    m_acTEncTop[layer].setMaxTempLayer                                    ( m_maxTempLayer );
336#else
337    if (layer== 0)
338    {
339      m_acTEncTop[layer].setMaxTempLayer                                  ( m_maxTempLayer );
340    }
341    else
342    {
343      m_acTEncTop[layer].setMaxTempLayer                                  ( m_EhMaxTempLayer[layer] );
344    }
345#endif
346    m_acTEncTop[layer].setUseAMP( m_enableAMP );
347
348    if( layer < m_numLayers - 1 )
349    {
350       m_acTEncTop[layer].setMaxTidIlRefPicsPlus1                         ( m_acLayerCfg[layer].getMaxTidIlRefPicsPlus1());
351    }
352
353#if VPS_EXTN_DIRECT_REF_LAYERS
354    if(layer)
355    {
356      UInt prevLayerIdx = 0;
357      UInt prevLayerId  = 0;
358      if (m_acLayerCfg[layer].getNumActiveRefLayers() > 0)
359      {
360        prevLayerIdx = m_acLayerCfg[layer].getPredLayerIdx(m_acLayerCfg[layer].getNumActiveRefLayers() - 1);
361        prevLayerId  = m_acTEncTop[layer].getRefLayerId(prevLayerIdx);
362      }
363      for(Int i = 0; i < MAX_VPS_LAYER_IDX_PLUS1; i++)
364      {
365        m_acTEncTop[layer].setSamplePredEnabledFlag                       (i, false);
366        m_acTEncTop[layer].setMotionPredEnabledFlag                       (i, false);
367      }
368      if(m_acLayerCfg[layer].getNumSamplePredRefLayers() == -1)
369      {
370        // Not included in the configuration file; assume that each layer depends on previous layer
371        m_acTEncTop[layer].setNumSamplePredRefLayers                      (1);      // One sample pred ref. layer
372        m_acTEncTop[layer].setSamplePredRefLayerId                        (prevLayerIdx, prevLayerId);   // Previous layer
373        m_acTEncTop[layer].setSamplePredEnabledFlag                       (prevLayerIdx, true);
374      }
375      else
376      {
377        m_acTEncTop[layer].setNumSamplePredRefLayers                      ( m_acLayerCfg[layer].getNumSamplePredRefLayers() );
378        for(Int i = 0; i < m_acTEncTop[layer].getNumSamplePredRefLayers(); i++)
379        {
380          m_acTEncTop[layer].setSamplePredRefLayerId                      ( i, m_acLayerCfg[layer].getSamplePredRefLayerId(i));
381        }
382      }
383      if(m_acLayerCfg[layer].getNumMotionPredRefLayers() == -1)
384      {
385        // Not included in the configuration file; assume that each layer depends on previous layer
386        m_acTEncTop[layer].setNumMotionPredRefLayers                      (1);      // One motion pred ref. layer
387        m_acTEncTop[layer].setMotionPredRefLayerId                        (prevLayerIdx, prevLayerId);   // Previous layer
388        m_acTEncTop[layer].setMotionPredEnabledFlag                       (prevLayerIdx, true);
389      }
390      else
391      {
392        m_acTEncTop[layer].setNumMotionPredRefLayers                      ( m_acLayerCfg[layer].getNumMotionPredRefLayers() );
393        for(Int i = 0; i < m_acTEncTop[layer].getNumMotionPredRefLayers(); i++)
394        {
395          m_acTEncTop[layer].setMotionPredRefLayerId                      ( i, m_acLayerCfg[layer].getMotionPredRefLayerId(i));
396        }
397      }
398      Int numDirectRefLayers = 0;
399
400      assert( layer < MAX_LAYERS );
401
402      for (Int i = 0; i < m_acLayerCfg[layer].m_layerId; i++)
403      {
404        Int refLayerId = -1;
405
406        for( Int layerIdc = 0; layerIdc < m_acTEncTop[layer].getNumSamplePredRefLayers(); layerIdc++ )
407        {
408          if( m_acLayerCfg[layer].getSamplePredRefLayerId(layerIdc) == i )
409          {
410            refLayerId = i;
411            m_acTEncTop[layer].setSamplePredEnabledFlag( numDirectRefLayers, true );
412            break;
413          }
414        }
415
416        for( Int layerIdc = 0; layerIdc < m_acTEncTop[layer].getNumMotionPredRefLayers(); layerIdc++ )
417        {
418          if( m_acLayerCfg[layer].getMotionPredRefLayerId(layerIdc) == i )
419          {
420            refLayerId = i;
421            m_acTEncTop[layer].setMotionPredEnabledFlag( numDirectRefLayers, true );
422            break;
423          }
424        }
425
426        if( refLayerId >= 0 )
427        {
428          m_acTEncTop[layer].setRefLayerId                                ( numDirectRefLayers, refLayerId );
429          numDirectRefLayers++;
430        }
431      }
432
433      m_acTEncTop[layer].setNumDirectRefLayers                            ( numDirectRefLayers );
434
435      if(m_acLayerCfg[layer].getNumActiveRefLayers() == -1)
436      {
437        m_acTEncTop[layer].setNumActiveRefLayers                          ( m_acTEncTop[layer].getNumDirectRefLayers() );
438        for( Int i = 0; i < m_acTEncTop[layer].getNumActiveRefLayers(); i++ )
439        {
440          m_acTEncTop[layer].setPredLayerIdx(i, i);
441        }
442      }
443      else
444      {
445        m_acTEncTop[layer].setNumActiveRefLayers                          ( m_acLayerCfg[layer].getNumActiveRefLayers() );
446        for(Int i = 0; i < m_acTEncTop[layer].getNumActiveRefLayers(); i++)
447        {
448          m_acTEncTop[layer].setPredLayerIdx                              ( i, m_acLayerCfg[layer].getPredLayerIdx(i));
449        }
450      }
451    }
452    else
453    {
454      assert( layer == 0 );
455      m_acTEncTop[layer].setNumDirectRefLayers(0);
456    }
457#endif //VPS_EXTN_DIRECT_REF_LAYERS
458    //===== Slice ========
459
460    //====== Loop/Deblock Filter ========
461    m_acTEncTop[layer].setLoopFilterDisable                                ( m_bLoopFilterDisable       );
462    m_acTEncTop[layer].setLoopFilterOffsetInPPS                            ( m_loopFilterOffsetInPPS );
463    m_acTEncTop[layer].setLoopFilterBetaOffset                             ( m_loopFilterBetaOffsetDiv2  );
464    m_acTEncTop[layer].setLoopFilterTcOffset                               ( m_loopFilterTcOffsetDiv2    );
465    m_acTEncTop[layer].setDeblockingFilterControlPresent                   ( m_DeblockingFilterControlPresent);
466    m_acTEncTop[layer].setDeblockingFilterMetric                           ( m_DeblockingFilterMetric );
467
468    //====== Motion search ========
469    m_acTEncTop[layer].setFastSearch                                       ( m_iFastSearch  );
470    m_acTEncTop[layer].setSearchRange                                      ( m_iSearchRange );
471    m_acTEncTop[layer].setBipredSearchRange                                ( m_bipredSearchRange );
472
473    //====== Quality control ========
474    m_acTEncTop[layer].setMaxDeltaQP                                       ( m_iMaxDeltaQP  );
475    m_acTEncTop[layer].setMaxCuDQPDepth                                    ( m_iMaxCuDQPDepth  );
476    m_acTEncTop[layer].setMaxCUChromaQpAdjustmentDepth                     ( m_maxCUChromaQpAdjustmentDepth );
477    m_acTEncTop[layer].setChromaCbQpOffset                                 ( m_cbQpOffset     );
478    m_acTEncTop[layer].setChromaCrQpOffset                                 ( m_crQpOffset  );
479
480    m_acTEncTop[layer].setChromaFormatIdc                                  ( m_acLayerCfg[layer].m_chromaFormatIDC  );
481
482#if ADAPTIVE_QP_SELECTION
483    m_acTEncTop[layer].setUseAdaptQpSelect                                 ( m_bUseAdaptQpSelect   );
484#endif
485   
486    m_acTEncTop[layer].setUseAdaptiveQP                                    ( m_bUseAdaptiveQP  );
487    m_acTEncTop[layer].setQPAdaptationRange                                ( m_iQPAdaptationRange );
488    m_acTEncTop[layer].setUseExtendedPrecision                             ( m_acLayerCfg[layer].m_useExtendedPrecision );
489    m_acTEncTop[layer].setUseHighPrecisionPredictionWeighting              ( m_acLayerCfg[layer].m_useHighPrecisionPredictionWeighting );
490
491    //====== Tool list ========   
492    m_acTEncTop[layer].setDeltaQpRD                                        ( m_uiDeltaQpRD  );
493    m_acTEncTop[layer].setUseASR                                           ( m_bUseASR      );
494    m_acTEncTop[layer].setUseHADME                                         ( m_bUseHADME    );   
495    m_acTEncTop[layer].setdQPs                                             ( m_acLayerCfg[layer].getdQPs() );
496    m_acTEncTop[layer].setUseRDOQ                                          ( m_useRDOQ     );
497    m_acTEncTop[layer].setUseRDOQTS                                        ( m_useRDOQTS   );
498    m_acTEncTop[layer].setRDpenalty                                        ( m_rdPenalty );
499#if LAYER_CTB
500    m_acTEncTop[layer].setQuadtreeTULog2MaxSize                            ( m_acLayerCfg[layer].m_uiQuadtreeTULog2MaxSize );
501    m_acTEncTop[layer].setQuadtreeTULog2MinSize                            ( m_acLayerCfg[layer].m_uiQuadtreeTULog2MinSize );
502    m_acTEncTop[layer].setQuadtreeTUMaxDepthInter                          ( m_acLayerCfg[layer].m_uiQuadtreeTUMaxDepthInter );
503    m_acTEncTop[layer].setQuadtreeTUMaxDepthIntra                          ( m_acLayerCfg[layer].m_uiQuadtreeTUMaxDepthIntra );
504#else
505    m_acTEncTop[layer].setQuadtreeTULog2MaxSize                            ( m_uiQuadtreeTULog2MaxSize );
506    m_acTEncTop[layer].setQuadtreeTULog2MinSize                            ( m_uiQuadtreeTULog2MinSize );
507    m_acTEncTop[layer].setQuadtreeTUMaxDepthInter                          ( m_uiQuadtreeTUMaxDepthInter );
508    m_acTEncTop[layer].setQuadtreeTUMaxDepthIntra                          ( m_uiQuadtreeTUMaxDepthIntra );
509#endif
510    m_acTEncTop[layer].setUseFastEnc                                       ( m_bUseFastEnc  );
511    m_acTEncTop[layer].setUseEarlyCU                                       ( m_bUseEarlyCU  );
512    m_acTEncTop[layer].setUseFastDecisionForMerge                          ( m_useFastDecisionForMerge  );
513    m_acTEncTop[layer].setUseCbfFastMode                                   ( m_bUseCbfFastMode  );
514    m_acTEncTop[layer].setUseEarlySkipDetection                            ( m_useEarlySkipDetection );
515    m_acTEncTop[layer].setUseCrossComponentPrediction                      ( m_useCrossComponentPrediction );
516    m_acTEncTop[layer].setUseReconBasedCrossCPredictionEstimate            ( m_reconBasedCrossCPredictionEstimate );
517    m_acTEncTop[layer].setSaoOffsetBitShift                                ( CHANNEL_TYPE_LUMA  , m_saoOffsetBitShift[CHANNEL_TYPE_LUMA]   );
518    m_acTEncTop[layer].setSaoOffsetBitShift                                ( CHANNEL_TYPE_CHROMA, m_saoOffsetBitShift[CHANNEL_TYPE_CHROMA] );
519    m_acTEncTop[layer].setUseTransformSkip                                 ( m_useTransformSkip      );
520    m_acTEncTop[layer].setUseTransformSkipFast                             ( m_useTransformSkipFast  );
521    m_acTEncTop[layer].setUseResidualRotation                              ( m_useResidualRotation   );
522    m_acTEncTop[layer].setUseSingleSignificanceMapContext                  ( m_useSingleSignificanceMapContext   );
523    m_acTEncTop[layer].setUseGolombRiceParameterAdaptation                 ( m_useGolombRiceParameterAdaptation );
524    m_acTEncTop[layer].setAlignCABACBeforeBypass                           ( m_alignCABACBeforeBypass );
525    m_acTEncTop[layer].setTransformSkipLog2MaxSize                         ( m_transformSkipLog2MaxSize  );
526    for (UInt signallingModeIndex = 0; signallingModeIndex < NUMBER_OF_RDPCM_SIGNALLING_MODES; signallingModeIndex++)
527    {
528      m_acTEncTop[layer].setUseResidualDPCM                                ( RDPCMSignallingMode(signallingModeIndex), m_useResidualDPCM[signallingModeIndex]);
529    }
530    m_acTEncTop[layer].setUseConstrainedIntraPred                          ( m_bUseConstrainedIntraPred );
531    m_acTEncTop[layer].setPCMLog2MinSize                                   ( m_uiPCMLog2MinSize);
532    m_acTEncTop[layer].setUsePCM                                           ( m_usePCM );
533    m_acTEncTop[layer].setPCMLog2MaxSize                                   ( m_pcmLog2MaxSize);
534    m_acTEncTop[layer].setMaxNumMergeCand                                  ( m_maxNumMergeCand );
535
536
537    //====== Weighted Prediction ========
538    m_acTEncTop[layer].setUseWP                                            ( m_useWeightedPred      );
539    m_acTEncTop[layer].setWPBiPred                                         ( m_useWeightedBiPred   );
540#if FAST_INTRA_SHVC
541    m_acTEncTop[layer].setUseFastIntraScalable                             ( m_useFastIntraScalable );
542#endif
543#if O0194_WEIGHTED_PREDICTION_CGS
544    if( layer != 0 && m_useInterLayerWeightedPred )
545    {
546      // Enable weighted prediction for enhancement layer
547      m_acTEncTop[layer].setUseWP                                           ( true   );
548      m_acTEncTop[layer].setWPBiPred                                        ( true   );
549    }
550#endif
551    //====== Parallel Merge Estimation ========
552    m_acTEncTop[layer].setLog2ParallelMergeLevelMinus2                      ( m_log2ParallelMergeLevel - 2 );
553
554    //====== Slice ========
555    m_acTEncTop[layer].setSliceMode                                         ( (SliceConstraint) m_sliceMode );
556    m_acTEncTop[layer].setSliceArgument                                     ( m_sliceArgument            );
557
558    //====== Dependent Slice ========
559    m_acTEncTop[layer].setSliceSegmentMode                                  ( (SliceConstraint) m_sliceSegmentMode );
560    m_acTEncTop[layer].setSliceSegmentArgument                              ( m_sliceSegmentArgument     );
561
562    if(m_sliceMode == NO_SLICES )
563    {
564      m_bLFCrossSliceBoundaryFlag = true;
565    }
566
567    m_acTEncTop[layer].setLFCrossSliceBoundaryFlag                          ( m_bLFCrossSliceBoundaryFlag );
568    m_acTEncTop[layer].setUseSAO                                            ( m_bUseSAO );
569    m_acTEncTop[layer].setMaxNumOffsetsPerPic                               ( m_maxNumOffsetsPerPic );
570
571    m_acTEncTop[layer].setSaoCtuBoundary                                    ( m_saoCtuBoundary );
572    m_acTEncTop[layer].setPCMInputBitDepthFlag                              ( m_bPCMInputBitDepthFlag);
573    m_acTEncTop[layer].setPCMFilterDisableFlag                              ( m_bPCMFilterDisableFlag);
574
575    m_acTEncTop[layer].setDisableIntraReferenceSmoothing                    (!m_enableIntraReferenceSmoothing );
576    m_acTEncTop[layer].setDecodedPictureHashSEIEnabled                      ( m_decodedPictureHashSEIEnabled );
577    m_acTEncTop[layer].setRecoveryPointSEIEnabled                           ( m_recoveryPointSEIEnabled );
578    m_acTEncTop[layer].setBufferingPeriodSEIEnabled                         ( m_bufferingPeriodSEIEnabled );
579    m_acTEncTop[layer].setPictureTimingSEIEnabled                           ( m_pictureTimingSEIEnabled );
580    m_acTEncTop[layer].setToneMappingInfoSEIEnabled                         ( m_toneMappingInfoSEIEnabled );
581    m_acTEncTop[layer].setTMISEIToneMapId                                   ( m_toneMapId );
582    m_acTEncTop[layer].setTMISEIToneMapCancelFlag                           ( m_toneMapCancelFlag );
583    m_acTEncTop[layer].setTMISEIToneMapPersistenceFlag                      ( m_toneMapPersistenceFlag );
584    m_acTEncTop[layer].setTMISEICodedDataBitDepth                           ( m_toneMapCodedDataBitDepth );
585    m_acTEncTop[layer].setTMISEITargetBitDepth                              ( m_toneMapTargetBitDepth );
586    m_acTEncTop[layer].setTMISEIModelID                                     ( m_toneMapModelId );
587    m_acTEncTop[layer].setTMISEIMinValue                                    ( m_toneMapMinValue );
588    m_acTEncTop[layer].setTMISEIMaxValue                                    ( m_toneMapMaxValue );
589    m_acTEncTop[layer].setTMISEISigmoidMidpoint                             ( m_sigmoidMidpoint );
590    m_acTEncTop[layer].setTMISEISigmoidWidth                                ( m_sigmoidWidth );
591    m_acTEncTop[layer].setTMISEIStartOfCodedInterva                         ( m_startOfCodedInterval );
592    m_acTEncTop[layer].setTMISEINumPivots                                   ( m_numPivots );
593    m_acTEncTop[layer].setTMISEICodedPivotValue                             ( m_codedPivotValue );
594    m_acTEncTop[layer].setTMISEITargetPivotValue                            ( m_targetPivotValue );
595    m_acTEncTop[layer].setTMISEICameraIsoSpeedIdc                           ( m_cameraIsoSpeedIdc );
596    m_acTEncTop[layer].setTMISEICameraIsoSpeedValue                         ( m_cameraIsoSpeedValue );
597    m_acTEncTop[layer].setTMISEIExposureIndexIdc                            ( m_exposureIndexIdc );
598    m_acTEncTop[layer].setTMISEIExposureIndexValue                          ( m_exposureIndexValue );
599    m_acTEncTop[layer].setTMISEIExposureCompensationValueSignFlag           ( m_exposureCompensationValueSignFlag );
600    m_acTEncTop[layer].setTMISEIExposureCompensationValueNumerator          ( m_exposureCompensationValueNumerator );
601    m_acTEncTop[layer].setTMISEIExposureCompensationValueDenomIdc           ( m_exposureCompensationValueDenomIdc );
602    m_acTEncTop[layer].setTMISEIRefScreenLuminanceWhite                     ( m_refScreenLuminanceWhite );
603    m_acTEncTop[layer].setTMISEIExtendedRangeWhiteLevel                     ( m_extendedRangeWhiteLevel );
604    m_acTEncTop[layer].setTMISEINominalBlackLevelLumaCodeValue              ( m_nominalBlackLevelLumaCodeValue );
605    m_acTEncTop[layer].setTMISEINominalWhiteLevelLumaCodeValue              ( m_nominalWhiteLevelLumaCodeValue );
606    m_acTEncTop[layer].setTMISEIExtendedWhiteLevelLumaCodeValue             ( m_extendedWhiteLevelLumaCodeValue );
607    m_acTEncTop[layer].setChromaSamplingFilterHintEnabled                   ( m_chromaSamplingFilterSEIenabled );
608    m_acTEncTop[layer].setChromaSamplingHorFilterIdc                        ( m_chromaSamplingHorFilterIdc );
609    m_acTEncTop[layer].setChromaSamplingVerFilterIdc                        ( m_chromaSamplingVerFilterIdc );
610    m_acTEncTop[layer].setFramePackingArrangementSEIEnabled                 ( m_framePackingSEIEnabled );
611    m_acTEncTop[layer].setFramePackingArrangementSEIType                    ( m_framePackingSEIType );
612    m_acTEncTop[layer].setFramePackingArrangementSEIId                      ( m_framePackingSEIId );
613    m_acTEncTop[layer].setFramePackingArrangementSEIQuincunx                ( m_framePackingSEIQuincunx );
614    m_acTEncTop[layer].setFramePackingArrangementSEIInterpretation          ( m_framePackingSEIInterpretation );
615    m_acTEncTop[layer].setSegmentedRectFramePackingArrangementSEIEnabled    ( m_segmentedRectFramePackingSEIEnabled );
616    m_acTEncTop[layer].setSegmentedRectFramePackingArrangementSEICancel     ( m_segmentedRectFramePackingSEICancel );
617    m_acTEncTop[layer].setSegmentedRectFramePackingArrangementSEIType       ( m_segmentedRectFramePackingSEIType );
618    m_acTEncTop[layer].setSegmentedRectFramePackingArrangementSEIPersistence( m_segmentedRectFramePackingSEIPersistence );
619    m_acTEncTop[layer].setDisplayOrientationSEIAngle                        ( m_displayOrientationSEIAngle );
620    m_acTEncTop[layer].setTemporalLevel0IndexSEIEnabled                     ( m_temporalLevel0IndexSEIEnabled );
621    m_acTEncTop[layer].setGradualDecodingRefreshInfoEnabled                 ( m_gradualDecodingRefreshInfoEnabled );
622    m_acTEncTop[layer].setNoDisplaySEITLayer                                ( m_noDisplaySEITLayer );
623    m_acTEncTop[layer].setDecodingUnitInfoSEIEnabled                        ( m_decodingUnitInfoSEIEnabled );
624    m_acTEncTop[layer].setSOPDescriptionSEIEnabled                          ( m_SOPDescriptionSEIEnabled );
625    m_acTEncTop[layer].setScalableNestingSEIEnabled                         ( m_scalableNestingSEIEnabled );
626    m_acTEncTop[layer].setTMCTSSEIEnabled                                   ( m_tmctsSEIEnabled );
627    m_acTEncTop[layer].setTimeCodeSEIEnabled                                ( m_timeCodeSEIEnabled );
628    m_acTEncTop[layer].setNumberOfTimeSets                                  ( m_timeCodeSEINumTs );
629    for(Int i = 0; i < m_timeCodeSEINumTs; i++) { m_acTEncTop[layer].setTimeSet(m_timeSetArray[i], i); }
630    m_acTEncTop[layer].setKneeSEIEnabled                                    ( m_kneeSEIEnabled );
631    m_acTEncTop[layer].setKneeSEIId                                         ( m_kneeSEIId );
632    m_acTEncTop[layer].setKneeSEICancelFlag                                 ( m_kneeSEICancelFlag );
633    m_acTEncTop[layer].setKneeSEIPersistenceFlag                            ( m_kneeSEIPersistenceFlag );   
634    m_acTEncTop[layer].setKneeSEIInputDrange                                ( m_kneeSEIInputDrange );
635    m_acTEncTop[layer].setKneeSEIInputDispLuminance                         ( m_kneeSEIInputDispLuminance );
636    m_acTEncTop[layer].setKneeSEIOutputDrange                               ( m_kneeSEIOutputDrange );
637    m_acTEncTop[layer].setKneeSEIOutputDispLuminance                        ( m_kneeSEIOutputDispLuminance );
638    m_acTEncTop[layer].setKneeSEINumKneePointsMinus1                        ( m_kneeSEINumKneePointsMinus1 );
639    m_acTEncTop[layer].setKneeSEIInputKneePoint                             ( m_kneeSEIInputKneePoint );
640    m_acTEncTop[layer].setKneeSEIOutputKneePoint                            ( m_kneeSEIOutputKneePoint );
641    m_acTEncTop[layer].setMasteringDisplaySEI                               ( m_masteringDisplay );
642#if P0123_ALPHA_CHANNEL_SEI
643    m_acTEncTop[layer].setAlphaSEIEnabled                                   ( m_alphaSEIEnabled );
644    m_acTEncTop[layer].setAlphaCancelFlag                                   ( m_alphaCancelFlag );
645    m_acTEncTop[layer].setAlphaUseIdc                                       ( m_alphaUseIdc );
646    m_acTEncTop[layer].setAlphaBitDepthMinus8                               ( m_alphaBitDepthMinus8 );
647    m_acTEncTop[layer].setAlphaTransparentValue                             ( m_alphaTransparentValue );
648    m_acTEncTop[layer].setAlphaOpaqueValue                                  ( m_alphaOpaqueValue );
649    m_acTEncTop[layer].setAlphaIncrementFlag                                ( m_alphaIncrementFlag );
650    m_acTEncTop[layer].setAlphaClipFlag                                     ( m_alphaClipFlag );
651    m_acTEncTop[layer].setAlphaClipTypeFlag                                 ( m_alphaClipTypeFlag );
652#endif
653#if Q0096_OVERLAY_SEI
654    m_acTEncTop[layer].setOverlaySEIEnabled                                 ( m_overlaySEIEnabled );
655    m_acTEncTop[layer].setOverlaySEICancelFlag                              ( m_overlayInfoCancelFlag );
656    m_acTEncTop[layer].setOverlaySEIContentAuxIdMinus128                    ( m_overlayContentAuxIdMinus128 );
657    m_acTEncTop[layer].setOverlaySEILabelAuxIdMinus128                      ( m_overlayLabelAuxIdMinus128 );
658    m_acTEncTop[layer].setOverlaySEIAlphaAuxIdMinus128                      ( m_overlayAlphaAuxIdMinus128 );
659    m_acTEncTop[layer].setOverlaySEIElementLabelValueLengthMinus8           ( m_overlayElementLabelValueLengthMinus8 );
660    m_acTEncTop[layer].setOverlaySEINumOverlaysMinus1                       ( m_numOverlaysMinus1 );
661    m_acTEncTop[layer].setOverlaySEIIdx                                     ( m_overlayIdx );
662    m_acTEncTop[layer].setOverlaySEILanguagePresentFlag                     ( m_overlayLanguagePresentFlag );
663    m_acTEncTop[layer].setOverlaySEIContentLayerId                          ( m_overlayContentLayerId );
664    m_acTEncTop[layer].setOverlaySEILabelPresentFlag                        ( m_overlayLabelPresentFlag );
665    m_acTEncTop[layer].setOverlaySEILabelLayerId                            ( m_overlayLabelLayerId );
666    m_acTEncTop[layer].setOverlaySEIAlphaPresentFlag                        ( m_overlayAlphaPresentFlag );
667    m_acTEncTop[layer].setOverlaySEIAlphaLayerId                            ( m_overlayAlphaLayerId );
668    m_acTEncTop[layer].setOverlaySEINumElementsMinus1                       ( m_numOverlayElementsMinus1 );
669    m_acTEncTop[layer].setOverlaySEIElementLabelMin                         ( m_overlayElementLabelMin );
670    m_acTEncTop[layer].setOverlaySEIElementLabelMax                         ( m_overlayElementLabelMax );
671    m_acTEncTop[layer].setOverlaySEILanguage                                ( m_overlayLanguage );
672    m_acTEncTop[layer].setOverlaySEIName                                    ( m_overlayName );
673    m_acTEncTop[layer].setOverlaySEIElementName                             ( m_overlayElementName );
674    m_acTEncTop[layer].setOverlaySEIPersistenceFlag                         ( m_overlayInfoPersistenceFlag );
675#endif
676#if Q0074_COLOUR_REMAPPING_SEI
677    m_acTEncTop[layer].setCRISEIFile                            ( const_cast<Char*>(m_acLayerCfg[layer].m_colourRemapSEIFile.c_str()) );
678    m_acTEncTop[layer].setCRISEIId                              ( m_acLayerCfg[layer].m_colourRemapSEIId );
679    m_acTEncTop[layer].setCRISEICancelFlag                      ( m_acLayerCfg[layer].m_colourRemapSEICancelFlag );
680    m_acTEncTop[layer].setCRISEIPersistenceFlag                 ( m_acLayerCfg[layer].m_colourRemapSEIPersistenceFlag );
681    m_acTEncTop[layer].setCRISEIVideoSignalInfoPresentFlag      ( m_acLayerCfg[layer].m_colourRemapSEIVideoSignalInfoPresentFlag );
682    m_acTEncTop[layer].setCRISEIFullRangeFlag                   ( m_acLayerCfg[layer].m_colourRemapSEIFullRangeFlag );
683    m_acTEncTop[layer].setCRISEIPrimaries                       ( m_acLayerCfg[layer].m_colourRemapSEIPrimaries );
684    m_acTEncTop[layer].setCRISEITransferFunction                ( m_acLayerCfg[layer].m_colourRemapSEITransferFunction );
685    m_acTEncTop[layer].setCRISEIMatrixCoefficients              ( m_acLayerCfg[layer].m_colourRemapSEIMatrixCoefficients );
686    m_acTEncTop[layer].setCRISEIInputBitDepth                   ( m_acLayerCfg[layer].m_colourRemapSEIInputBitDepth );
687    m_acTEncTop[layer].setCRISEIBitDepth                        ( m_acLayerCfg[layer].m_colourRemapSEIBitDepth );
688    m_acTEncTop[layer].setCRISEIPreLutNumValMinus1              ( m_acLayerCfg[layer].m_colourRemapSEIPreLutNumValMinus1 );
689    m_acTEncTop[layer].setCRISEIPreLutCodedValue                ( m_acLayerCfg[layer].m_colourRemapSEIPreLutCodedValue );
690    m_acTEncTop[layer].setCRISEIPreLutTargetValue               ( m_acLayerCfg[layer].m_colourRemapSEIPreLutTargetValue );
691    m_acTEncTop[layer].setCRISEIMatrixPresentFlag               ( m_acLayerCfg[layer].m_colourRemapSEIMatrixPresentFlag );
692    m_acTEncTop[layer].setCRISEILog2MatrixDenom                 ( m_acLayerCfg[layer].m_colourRemapSEILog2MatrixDenom );
693    m_acTEncTop[layer].setCRISEICoeffs                          ( m_acLayerCfg[layer].m_colourRemapSEICoeffs );
694    m_acTEncTop[layer].setCRISEIPostLutNumValMinus1             ( m_acLayerCfg[layer].m_colourRemapSEIPostLutNumValMinus1 );
695    m_acTEncTop[layer].setCRISEIPostLutCodedValue               ( m_acLayerCfg[layer]. m_colourRemapSEIPostLutCodedValue );
696    m_acTEncTop[layer].setCRISEIPostLutTargetValue              ( m_acLayerCfg[layer].m_colourRemapSEIPostLutTargetValue );
697#endif   
698#if LAYERS_NOT_PRESENT_SEI
699    m_acTEncTop[layer].setLayersNotPresentSEIEnabled            ( m_layersNotPresentSEIEnabled );
700#endif   
701#if Q0189_TMVP_CONSTRAINTS
702    m_acTEncTop[layer].setTMVPConstraintsSEIEnabled             ( m_TMVPConstraintsSEIEnabled);           
703#endif
704#if N0383_IL_CONSTRAINED_TILE_SETS_SEI
705    m_acTEncTop[layer].setInterLayerConstrainedTileSetsSEIEnabled( m_interLayerConstrainedTileSetsSEIEnabled );
706    m_acTEncTop[layer].setIlNumSetsInMessage                    ( m_ilNumSetsInMessage );
707    m_acTEncTop[layer].setSkippedTileSetPresentFlag             ( m_skippedTileSetPresentFlag );
708    m_acTEncTop[layer].setTopLeftTileIndex                      ( m_topLeftTileIndex );
709    m_acTEncTop[layer].setBottomRightTileIndex                  ( m_bottomRightTileIndex );
710    m_acTEncTop[layer].setIlcIdc                                ( m_ilcIdc );
711#endif
712    m_acTEncTop[layer].setTileUniformSpacingFlag                ( m_tileUniformSpacingFlag );
713    m_acTEncTop[layer].setNumColumnsMinus1                      ( m_numTileColumnsMinus1 );
714    m_acTEncTop[layer].setNumRowsMinus1                         ( m_numTileRowsMinus1 );
715    if(!m_tileUniformSpacingFlag)
716    {
717      m_acTEncTop[layer].setColumnWidth                         ( m_tileColumnWidth );
718      m_acTEncTop[layer].setRowHeight                           ( m_tileRowHeight );
719    }
720    m_acTEncTop[layer].xCheckGSParameters();
721    Int uiTilesCount = (m_numTileRowsMinus1+1) * (m_numTileColumnsMinus1+1);
722    if(uiTilesCount == 1)
723    {
724      m_bLFCrossTileBoundaryFlag = true;
725    }
726    m_acTEncTop[layer].setLFCrossTileBoundaryFlag               ( m_bLFCrossTileBoundaryFlag );
727    m_acTEncTop[layer].setWaveFrontSynchro                      ( m_acLayerCfg[layer].m_waveFrontSynchro );
728    m_acTEncTop[layer].setWaveFrontSubstreams                   ( m_acLayerCfg[layer].m_iWaveFrontSubstreams );
729    m_acTEncTop[layer].setTMVPModeId                            ( m_TMVPModeId );
730    m_acTEncTop[layer].setUseScalingListId                      ( m_useScalingListId  );
731    m_acTEncTop[layer].setScalingListFile                       ( m_scalingListFile   );
732    m_acTEncTop[layer].setSignHideFlag                          ( m_signHideFlag );
733#if RC_SHVC_HARMONIZATION
734    m_acTEncTop[layer].setUseRateCtrl                           ( m_acLayerCfg[layer].getRCEnableRateControl() );
735    m_acTEncTop[layer].setTargetBitrate                         ( m_acLayerCfg[layer].getRCTargetBitrate() );
736    m_acTEncTop[layer].setKeepHierBit                           ( m_acLayerCfg[layer].getRCKeepHierarchicalBit() );
737    m_acTEncTop[layer].setLCULevelRC                            ( m_acLayerCfg[layer].getRCLCULevelRC() );
738    m_acTEncTop[layer].setUseLCUSeparateModel                   ( m_acLayerCfg[layer].getRCUseLCUSeparateModel() );
739    m_acTEncTop[layer].setInitialQP                             ( m_acLayerCfg[layer].getRCInitialQP() );
740    m_acTEncTop[layer].setForceIntraQP                          ( m_acLayerCfg[layer].getRCForceIntraQP() );
741#else
742    m_acTEncTop[layer].setUseRateCtrl                           ( m_RCEnableRateControl );
743    m_acTEncTop[layer].setTargetBitrate                         ( m_RCTargetBitrate );
744    m_acTEncTop[layer].setKeepHierBit                           ( m_RCKeepHierarchicalBit );
745    m_acTEncTop[layer].setLCULevelRC                            ( m_RCLCULevelRC );
746    m_acTEncTop[layer].setUseLCUSeparateModel                   ( m_RCUseLCUSeparateModel );
747    m_acTEncTop[layer].setInitialQP                             ( m_RCInitialQP );
748    m_acTEncTop[layer].setForceIntraQP                          ( m_RCForceIntraQP );
749#endif
750    m_acTEncTop[layer].setTransquantBypassEnableFlag            ( m_TransquantBypassEnableFlag );
751    m_acTEncTop[layer].setCUTransquantBypassFlagForceValue      ( m_CUTransquantBypassFlagForce );
752    m_acTEncTop[layer].setCostMode                              ( m_costMode );
753    m_acTEncTop[layer].setUseRecalculateQPAccordingToLambda     ( m_recalculateQPAccordingToLambda );
754    m_acTEncTop[layer].setUseStrongIntraSmoothing               ( m_useStrongIntraSmoothing );
755    m_acTEncTop[layer].setActiveParameterSetsSEIEnabled         ( m_activeParameterSetsSEIEnabled );
756    m_acTEncTop[layer].setVuiParametersPresentFlag              ( m_vuiParametersPresentFlag );
757    m_acTEncTop[layer].setAspectRatioInfoPresentFlag            ( m_aspectRatioInfoPresentFlag);
758    m_acTEncTop[layer].setAspectRatioIdc                        ( m_aspectRatioIdc );
759    m_acTEncTop[layer].setSarWidth                              ( m_sarWidth );
760    m_acTEncTop[layer].setSarHeight                             ( m_sarHeight );
761    m_acTEncTop[layer].setOverscanInfoPresentFlag               ( m_overscanInfoPresentFlag );
762    m_acTEncTop[layer].setOverscanAppropriateFlag               ( m_overscanAppropriateFlag );
763    m_acTEncTop[layer].setVideoSignalTypePresentFlag            ( m_videoSignalTypePresentFlag );
764    m_acTEncTop[layer].setVideoFormat                           ( m_videoFormat );
765    m_acTEncTop[layer].setVideoFullRangeFlag                    ( m_videoFullRangeFlag );
766    m_acTEncTop[layer].setColourDescriptionPresentFlag          ( m_colourDescriptionPresentFlag );
767    m_acTEncTop[layer].setColourPrimaries                       ( m_colourPrimaries );
768    m_acTEncTop[layer].setTransferCharacteristics               ( m_transferCharacteristics );
769    m_acTEncTop[layer].setMatrixCoefficients                    ( m_matrixCoefficients );
770    m_acTEncTop[layer].setChromaLocInfoPresentFlag              ( m_chromaLocInfoPresentFlag );
771    m_acTEncTop[layer].setChromaSampleLocTypeTopField           ( m_chromaSampleLocTypeTopField );
772    m_acTEncTop[layer].setChromaSampleLocTypeBottomField        ( m_chromaSampleLocTypeBottomField );
773    m_acTEncTop[layer].setNeutralChromaIndicationFlag           ( m_neutralChromaIndicationFlag );
774    m_acTEncTop[layer].setDefaultDisplayWindow                  ( m_defDispWinLeftOffset, m_defDispWinRightOffset, m_defDispWinTopOffset, m_defDispWinBottomOffset );
775    m_acTEncTop[layer].setFrameFieldInfoPresentFlag             ( m_frameFieldInfoPresentFlag );
776    m_acTEncTop[layer].setPocProportionalToTimingFlag           ( m_pocProportionalToTimingFlag );
777    m_acTEncTop[layer].setNumTicksPocDiffOneMinus1              ( m_numTicksPocDiffOneMinus1    );
778    m_acTEncTop[layer].setBitstreamRestrictionFlag              ( m_bitstreamRestrictionFlag );
779    m_acTEncTop[layer].setTilesFixedStructureFlag               ( m_tilesFixedStructureFlag );
780    m_acTEncTop[layer].setMotionVectorsOverPicBoundariesFlag    ( m_motionVectorsOverPicBoundariesFlag );
781    m_acTEncTop[layer].setMinSpatialSegmentationIdc             ( m_minSpatialSegmentationIdc );
782    m_acTEncTop[layer].setMaxBytesPerPicDenom                   ( m_maxBytesPerPicDenom );
783    m_acTEncTop[layer].setMaxBitsPerMinCuDenom                  ( m_maxBitsPerMinCuDenom );
784    m_acTEncTop[layer].setLog2MaxMvLengthHorizontal             ( m_log2MaxMvLengthHorizontal );
785    m_acTEncTop[layer].setLog2MaxMvLengthVertical               ( m_log2MaxMvLengthVertical );
786    m_acTEncTop[layer].setElRapSliceTypeB                       (layer == 0? 0 : m_elRapSliceBEnabled);
787
788    if( layer > 0 )
789    {
790#if REF_REGION_OFFSET
791#if AUXILIARY_PICTURES
792      Int subWidthC  = ( m_acLayerCfg[layer].m_chromaFormatIDC == CHROMA_420 || m_acLayerCfg[layer].m_chromaFormatIDC == CHROMA_422 ) ? 2 : 1;
793      Int subHeightC = ( m_acLayerCfg[layer].m_chromaFormatIDC == CHROMA_420 ) ? 2 : 1;
794#else
795      Int subWidthC  = 2;
796      Int subHeightC = 2;
797#endif
798#endif
799      m_acTEncTop[layer].setNumRefLayerLocationOffsets          ( m_acLayerCfg[layer].m_numRefLayerLocationOffsets );
800      for(Int i = 0; i < m_acLayerCfg[layer].m_numRefLayerLocationOffsets; i++)
801      {
802#if O0098_SCALED_REF_LAYER_ID
803        m_acTEncTop[layer].setRefLocationOffsetLayerId          (i, m_acLayerCfg[layer].m_refLocationOffsetLayerId[i]);
804#endif
805#if REF_REGION_OFFSET
806        m_acTEncTop[layer].setScaledRefLayerOffsetPresentFlag   ( i, m_acLayerCfg[layer].m_scaledRefLayerOffsetPresentFlag[i] );
807        m_acTEncTop[layer].getScaledRefLayerWindow(i).setWindow ( subWidthC  * m_acLayerCfg[layer].m_scaledRefLayerLeftOffset[i], subWidthC  * m_acLayerCfg[layer].m_scaledRefLayerRightOffset[i],
808                                                                  subHeightC * m_acLayerCfg[layer].m_scaledRefLayerTopOffset[i],  subHeightC * m_acLayerCfg[layer].m_scaledRefLayerBottomOffset[i]);
809#else
810#if P0312_VERT_PHASE_ADJ
811        m_acTEncTop[layer].setVertPhasePositionEnableFlag       ( i, m_acLayerCfg[layer].m_vertPhasePositionEnableFlag[i] );
812        m_acTEncTop[layer].getScaledRefLayerWindow(i).setWindow ( 2*m_acLayerCfg[layer].m_scaledRefLayerLeftOffset[i], 2*m_acLayerCfg[layer].m_scaledRefLayerRightOffset[i],
813          2*m_acLayerCfg[layer].m_scaledRefLayerTopOffset[i], 2*m_acLayerCfg[layer].m_scaledRefLayerBottomOffset[i], m_acLayerCfg[layer].m_vertPhasePositionEnableFlag[i] );
814#else
815        m_acTEncTop[layer].getScaledRefLayerWindow(i).setWindow ( 2*m_acLayerCfg[layer].m_scaledRefLayerLeftOffset[i], 2*m_acLayerCfg[layer].m_scaledRefLayerRightOffset[i],
816          2*m_acLayerCfg[layer].m_scaledRefLayerTopOffset[i], 2*m_acLayerCfg[layer].m_scaledRefLayerBottomOffset[i]);
817#endif
818#endif
819        Int rlSubWidthC  = ( m_acLayerCfg[i].m_chromaFormatIDC == CHROMA_420 || m_acLayerCfg[i].m_chromaFormatIDC == CHROMA_422 ) ? 2 : 1;
820        Int rlSubHeightC = ( m_acLayerCfg[i].m_chromaFormatIDC == CHROMA_420 ) ? 2 : 1;
821
822        m_acTEncTop[layer].setRefRegionOffsetPresentFlag        ( i, m_acLayerCfg[layer].m_refRegionOffsetPresentFlag[i] );
823        m_acTEncTop[layer].getRefLayerWindow(i).setWindow       ( rlSubWidthC  * m_acLayerCfg[layer].m_refRegionLeftOffset[i], rlSubWidthC  * m_acLayerCfg[layer].m_refRegionRightOffset[i],
824                                                                  rlSubHeightC * m_acLayerCfg[layer].m_refRegionTopOffset[i],  rlSubHeightC * m_acLayerCfg[layer].m_refRegionBottomOffset[i]);
825#if R0209_GENERIC_PHASE
826        m_acTEncTop[layer].setResamplePhaseSetPresentFlag       ( i, m_acLayerCfg[layer].m_resamplePhaseSetPresentFlag[i] );
827        m_acTEncTop[layer].setPhaseHorLuma                      ( i, m_acLayerCfg[layer].m_phaseHorLuma[i] );
828        m_acTEncTop[layer].setPhaseVerLuma                      ( i, m_acLayerCfg[layer].m_phaseVerLuma[i] );
829        m_acTEncTop[layer].setPhaseHorChroma                    ( i, m_acLayerCfg[layer].m_phaseHorChroma[i] );
830        m_acTEncTop[layer].setPhaseVerChroma                    ( i, m_acLayerCfg[layer].m_phaseVerChroma[i] );
831#endif
832      }
833    }
834
835#if M0040_ADAPTIVE_RESOLUTION_CHANGE
836    m_acTEncTop[layer].setAdaptiveResolutionChange               ( m_adaptiveResolutionChange );
837#endif
838#if R0071_IRAP_EOS_CROSS_LAYER_IMPACTS
839    m_acTEncTop[layer].setLayerSwitchOffBegin                    (m_acLayerCfg[layer].m_layerSwitchOffBegin);
840    m_acTEncTop[layer].setLayerSwitchOffEnd                      (m_acLayerCfg[layer].m_layerSwitchOffEnd);
841#endif
842#if AUXILIARY_PICTURES
843    m_acTEncTop[layer].setChromaFormatIDC                        ( m_acLayerCfg[layer].m_chromaFormatIDC );
844#endif
845#if O0153_ALT_OUTPUT_LAYER_FLAG
846    m_acTEncTop[layer].setAltOuputLayerFlag                      ( m_altOutputLayerFlag );
847#endif
848#if O0149_CROSS_LAYER_BLA_FLAG
849    m_acTEncTop[layer].setCrossLayerBLAFlag                      ( m_crossLayerBLAFlag );
850#endif
851#if Q0048_CGS_3D_ASYMLUT
852    m_acTEncTop[layer].setCGSFlag                                ( layer == 0 ? 0 : m_nCGSFlag );
853    m_acTEncTop[layer].setCGSMaxOctantDepth                      ( m_nCGSMaxOctantDepth );
854    m_acTEncTop[layer].setCGSMaxYPartNumLog2                     ( m_nCGSMaxYPartNumLog2 );
855    m_acTEncTop[layer].setCGSLUTBit                              ( m_nCGSLUTBit );
856#if R0151_CGS_3D_ASYMLUT_IMPROVE
857    m_acTEncTop[layer].setCGSAdaptChroma                         ( m_nCGSAdaptiveChroma );
858#endif
859#if R0179_ENC_OPT_3DLUT_SIZE
860    m_acTEncTop[layer].setCGSLutSizeRDO                          ( m_nCGSLutSizeRDO );
861#endif
862#endif
863#if Q0078_ADD_LAYER_SETS
864    m_acTEncTop[layer].setNumAddLayerSets                        ( m_numAddLayerSets );
865#endif
866  }
867}
868#else //SVC_EXTENSION
869Void TAppEncTop::xInitLibCfg()
870{
871  TComVPS vps;
872
873  vps.setMaxTLayers                                               ( m_maxTempLayer );
874  if (m_maxTempLayer == 1)
875  {
876    vps.setTemporalNestingFlag(true);
877  }
878  vps.setMaxLayers                                                ( 1 );
879  for(Int i = 0; i < MAX_TLAYER; i++)
880  {
881    vps.setNumReorderPics                                         ( m_numReorderPics[i], i );
882    vps.setMaxDecPicBuffering                                     ( m_maxDecPicBuffering[i], i );
883  }
884  m_cTEncTop.setVPS(&vps);
885
886  m_cTEncTop.setProfile                                           ( m_profile);
887  m_cTEncTop.setLevel                                             ( m_levelTier, m_level);
888  m_cTEncTop.setProgressiveSourceFlag                             ( m_progressiveSourceFlag);
889  m_cTEncTop.setInterlacedSourceFlag                              ( m_interlacedSourceFlag);
890  m_cTEncTop.setNonPackedConstraintFlag                           ( m_nonPackedConstraintFlag);
891  m_cTEncTop.setFrameOnlyConstraintFlag                           ( m_frameOnlyConstraintFlag);
892  m_cTEncTop.setBitDepthConstraintValue                           ( m_bitDepthConstraint );
893  m_cTEncTop.setChromaFormatConstraintValue                       ( m_chromaFormatConstraint );
894  m_cTEncTop.setIntraConstraintFlag                               ( m_intraConstraintFlag );
895  m_cTEncTop.setLowerBitRateConstraintFlag                        ( m_lowerBitRateConstraintFlag );
896
897  m_cTEncTop.setPrintMSEBasedSequencePSNR                         ( m_printMSEBasedSequencePSNR);
898  m_cTEncTop.setPrintFrameMSE                                     ( m_printFrameMSE);
899  m_cTEncTop.setPrintSequenceMSE                                  ( m_printSequenceMSE);
900  m_cTEncTop.setCabacZeroWordPaddingEnabled                       ( m_cabacZeroWordPaddingEnabled );
901
902  m_cTEncTop.setFrameRate                                         ( m_iFrameRate );
903  m_cTEncTop.setFrameSkip                                         ( m_FrameSkip );
904  m_cTEncTop.setSourceWidth                                       ( m_iSourceWidth );
905  m_cTEncTop.setSourceHeight                                      ( m_iSourceHeight );
906  m_cTEncTop.setConformanceWindow                                 ( m_confWinLeft, m_confWinRight, m_confWinTop, m_confWinBottom );
907  m_cTEncTop.setFramesToBeEncoded                                 ( m_framesToBeEncoded );
908
909  //====== Coding Structure ========
910  m_cTEncTop.setIntraPeriod                                       ( m_iIntraPeriod );
911  m_cTEncTop.setDecodingRefreshType                               ( m_iDecodingRefreshType );
912  m_cTEncTop.setGOPSize                                           ( m_iGOPSize );
913  m_cTEncTop.setGopList                                           ( m_GOPList );
914  m_cTEncTop.setExtraRPSs                                         ( m_extraRPSs );
915  for(Int i = 0; i < MAX_TLAYER; i++)
916  {
917    m_cTEncTop.setNumReorderPics                                  ( m_numReorderPics[i], i );
918    m_cTEncTop.setMaxDecPicBuffering                              ( m_maxDecPicBuffering[i], i );
919  }
920  for( UInt uiLoop = 0; uiLoop < MAX_TLAYER; ++uiLoop )
921  {
922    m_cTEncTop.setLambdaModifier                                  ( uiLoop, m_adLambdaModifier[ uiLoop ] );
923  }
924  m_cTEncTop.setQP                                                ( m_iQP );
925
926  m_cTEncTop.setPad                                               ( m_aiPad );
927
928  m_cTEncTop.setMaxTempLayer                                      ( m_maxTempLayer );
929  m_cTEncTop.setUseAMP( m_enableAMP );
930
931  //===== Slice ========
932
933  //====== Loop/Deblock Filter ========
934  m_cTEncTop.setLoopFilterDisable                                 ( m_bLoopFilterDisable       );
935  m_cTEncTop.setLoopFilterOffsetInPPS                             ( m_loopFilterOffsetInPPS );
936  m_cTEncTop.setLoopFilterBetaOffset                              ( m_loopFilterBetaOffsetDiv2  );
937  m_cTEncTop.setLoopFilterTcOffset                                ( m_loopFilterTcOffsetDiv2    );
938  m_cTEncTop.setDeblockingFilterControlPresent                    ( m_DeblockingFilterControlPresent);
939  m_cTEncTop.setDeblockingFilterMetric                            ( m_DeblockingFilterMetric );
940
941  //====== Motion search ========
942  m_cTEncTop.setFastSearch                                        ( m_iFastSearch  );
943  m_cTEncTop.setSearchRange                                       ( m_iSearchRange );
944  m_cTEncTop.setBipredSearchRange                                 ( m_bipredSearchRange );
945
946  //====== Quality control ========
947  m_cTEncTop.setMaxDeltaQP                                        ( m_iMaxDeltaQP  );
948  m_cTEncTop.setMaxCuDQPDepth                                     ( m_iMaxCuDQPDepth  );
949  m_cTEncTop.setMaxCUChromaQpAdjustmentDepth                      ( m_maxCUChromaQpAdjustmentDepth );
950  m_cTEncTop.setChromaCbQpOffset                                  ( m_cbQpOffset     );
951  m_cTEncTop.setChromaCrQpOffset                                  ( m_crQpOffset  );
952
953  m_cTEncTop.setChromaFormatIdc                                   ( m_chromaFormatIDC  );
954
955#if ADAPTIVE_QP_SELECTION
956  m_cTEncTop.setUseAdaptQpSelect                                  ( m_bUseAdaptQpSelect   );
957#endif
958
959  m_cTEncTop.setUseAdaptiveQP                                     ( m_bUseAdaptiveQP  );
960  m_cTEncTop.setQPAdaptationRange                                 ( m_iQPAdaptationRange );
961  m_cTEncTop.setUseExtendedPrecision                              ( m_useExtendedPrecision );
962  m_cTEncTop.setUseHighPrecisionPredictionWeighting               ( m_useHighPrecisionPredictionWeighting );
963  //====== Tool list ========
964  m_cTEncTop.setDeltaQpRD                                         ( m_uiDeltaQpRD  );
965  m_cTEncTop.setUseASR                                            ( m_bUseASR      );
966  m_cTEncTop.setUseHADME                                          ( m_bUseHADME    );
967  m_cTEncTop.setdQPs                                              ( m_aidQP        );
968  m_cTEncTop.setUseRDOQ                                           ( m_useRDOQ     );
969  m_cTEncTop.setUseRDOQTS                                         ( m_useRDOQTS   );
970  m_cTEncTop.setRDpenalty                                         ( m_rdPenalty );
971  m_cTEncTop.setQuadtreeTULog2MaxSize                             ( m_uiQuadtreeTULog2MaxSize );
972  m_cTEncTop.setQuadtreeTULog2MinSize                             ( m_uiQuadtreeTULog2MinSize );
973  m_cTEncTop.setQuadtreeTUMaxDepthInter                           ( m_uiQuadtreeTUMaxDepthInter );
974  m_cTEncTop.setQuadtreeTUMaxDepthIntra                           ( m_uiQuadtreeTUMaxDepthIntra );
975  m_cTEncTop.setUseFastEnc                                        ( m_bUseFastEnc  );
976  m_cTEncTop.setUseEarlyCU                                        ( m_bUseEarlyCU  );
977  m_cTEncTop.setUseFastDecisionForMerge                           ( m_useFastDecisionForMerge  );
978  m_cTEncTop.setUseCbfFastMode                                    ( m_bUseCbfFastMode  );
979  m_cTEncTop.setUseEarlySkipDetection                             ( m_useEarlySkipDetection );
980#if FAST_INTRA_SHVC
981  m_cTEncTop.setUseFastIntraScalable                              ( m_useFastIntraScalable );
982#endif
983  m_cTEncTop.setUseCrossComponentPrediction                       ( m_useCrossComponentPrediction );
984  m_cTEncTop.setUseReconBasedCrossCPredictionEstimate             ( m_reconBasedCrossCPredictionEstimate );
985  m_cTEncTop.setSaoOffsetBitShift                                 ( CHANNEL_TYPE_LUMA  , m_saoOffsetBitShift[CHANNEL_TYPE_LUMA]   );
986  m_cTEncTop.setSaoOffsetBitShift                                 ( CHANNEL_TYPE_CHROMA, m_saoOffsetBitShift[CHANNEL_TYPE_CHROMA] );
987  m_cTEncTop.setUseTransformSkip                                  ( m_useTransformSkip      );
988  m_cTEncTop.setUseTransformSkipFast                              ( m_useTransformSkipFast  );
989  m_cTEncTop.setUseResidualRotation                               ( m_useResidualRotation   );
990  m_cTEncTop.setUseSingleSignificanceMapContext                   ( m_useSingleSignificanceMapContext   );
991  m_cTEncTop.setUseGolombRiceParameterAdaptation                  ( m_useGolombRiceParameterAdaptation );
992  m_cTEncTop.setAlignCABACBeforeBypass                            ( m_alignCABACBeforeBypass );
993  m_cTEncTop.setTransformSkipLog2MaxSize                          ( m_transformSkipLog2MaxSize  );
994  for (UInt signallingModeIndex = 0; signallingModeIndex < NUMBER_OF_RDPCM_SIGNALLING_MODES; signallingModeIndex++)
995  {
996    m_cTEncTop.setUseResidualDPCM                                 ( RDPCMSignallingMode(signallingModeIndex), m_useResidualDPCM[signallingModeIndex]);
997  }
998  m_cTEncTop.setUseConstrainedIntraPred                           ( m_bUseConstrainedIntraPred );
999  m_cTEncTop.setPCMLog2MinSize                                    ( m_uiPCMLog2MinSize);
1000  m_cTEncTop.setUsePCM                                            ( m_usePCM );
1001  m_cTEncTop.setPCMLog2MaxSize                                    ( m_pcmLog2MaxSize);
1002  m_cTEncTop.setMaxNumMergeCand                                   ( m_maxNumMergeCand );
1003
1004
1005  //====== Weighted Prediction ========
1006  m_cTEncTop.setUseWP                                             ( m_useWeightedPred      );
1007  m_cTEncTop.setWPBiPred                                          ( m_useWeightedBiPred   );
1008  //====== Parallel Merge Estimation ========
1009  m_cTEncTop.setLog2ParallelMergeLevelMinus2                      ( m_log2ParallelMergeLevel - 2 );
1010
1011  //====== Slice ========
1012  m_cTEncTop.setSliceMode                                         ( (SliceConstraint) m_sliceMode );
1013  m_cTEncTop.setSliceArgument                                     ( m_sliceArgument            );
1014
1015  //====== Dependent Slice ========
1016  m_cTEncTop.setSliceSegmentMode                                  (  (SliceConstraint) m_sliceSegmentMode );
1017  m_cTEncTop.setSliceSegmentArgument                              ( m_sliceSegmentArgument     );
1018
1019  if(m_sliceMode == NO_SLICES )
1020  {
1021    m_bLFCrossSliceBoundaryFlag = true;
1022  }
1023  m_cTEncTop.setLFCrossSliceBoundaryFlag                          ( m_bLFCrossSliceBoundaryFlag );
1024  m_cTEncTop.setUseSAO                                            ( m_bUseSAO );
1025  m_cTEncTop.setMaxNumOffsetsPerPic                               ( m_maxNumOffsetsPerPic);
1026
1027  m_cTEncTop.setSaoCtuBoundary                                    ( m_saoCtuBoundary);
1028  m_cTEncTop.setPCMInputBitDepthFlag                              ( m_bPCMInputBitDepthFlag);
1029  m_cTEncTop.setPCMFilterDisableFlag                              ( m_bPCMFilterDisableFlag);
1030
1031  m_cTEncTop.setDisableIntraReferenceSmoothing                    (!m_enableIntraReferenceSmoothing );
1032  m_cTEncTop.setDecodedPictureHashSEIEnabled                      ( m_decodedPictureHashSEIEnabled );
1033  m_cTEncTop.setRecoveryPointSEIEnabled                           ( m_recoveryPointSEIEnabled );
1034  m_cTEncTop.setBufferingPeriodSEIEnabled                         ( m_bufferingPeriodSEIEnabled );
1035  m_cTEncTop.setPictureTimingSEIEnabled                           ( m_pictureTimingSEIEnabled );
1036  m_cTEncTop.setToneMappingInfoSEIEnabled                         ( m_toneMappingInfoSEIEnabled );
1037  m_cTEncTop.setTMISEIToneMapId                                   ( m_toneMapId );
1038  m_cTEncTop.setTMISEIToneMapCancelFlag                           ( m_toneMapCancelFlag );
1039  m_cTEncTop.setTMISEIToneMapPersistenceFlag                      ( m_toneMapPersistenceFlag );
1040  m_cTEncTop.setTMISEICodedDataBitDepth                           ( m_toneMapCodedDataBitDepth );
1041  m_cTEncTop.setTMISEITargetBitDepth                              ( m_toneMapTargetBitDepth );
1042  m_cTEncTop.setTMISEIModelID                                     ( m_toneMapModelId );
1043  m_cTEncTop.setTMISEIMinValue                                    ( m_toneMapMinValue );
1044  m_cTEncTop.setTMISEIMaxValue                                    ( m_toneMapMaxValue );
1045  m_cTEncTop.setTMISEISigmoidMidpoint                             ( m_sigmoidMidpoint );
1046  m_cTEncTop.setTMISEISigmoidWidth                                ( m_sigmoidWidth );
1047  m_cTEncTop.setTMISEIStartOfCodedInterva                         ( m_startOfCodedInterval );
1048  m_cTEncTop.setTMISEINumPivots                                   ( m_numPivots );
1049  m_cTEncTop.setTMISEICodedPivotValue                             ( m_codedPivotValue );
1050  m_cTEncTop.setTMISEITargetPivotValue                            ( m_targetPivotValue );
1051  m_cTEncTop.setTMISEICameraIsoSpeedIdc                           ( m_cameraIsoSpeedIdc );
1052  m_cTEncTop.setTMISEICameraIsoSpeedValue                         ( m_cameraIsoSpeedValue );
1053  m_cTEncTop.setTMISEIExposureIndexIdc                            ( m_exposureIndexIdc );
1054  m_cTEncTop.setTMISEIExposureIndexValue                          ( m_exposureIndexValue );
1055  m_cTEncTop.setTMISEIExposureCompensationValueSignFlag           ( m_exposureCompensationValueSignFlag );
1056  m_cTEncTop.setTMISEIExposureCompensationValueNumerator          ( m_exposureCompensationValueNumerator );
1057  m_cTEncTop.setTMISEIExposureCompensationValueDenomIdc           ( m_exposureCompensationValueDenomIdc );
1058  m_cTEncTop.setTMISEIRefScreenLuminanceWhite                     ( m_refScreenLuminanceWhite );
1059  m_cTEncTop.setTMISEIExtendedRangeWhiteLevel                     ( m_extendedRangeWhiteLevel );
1060  m_cTEncTop.setTMISEINominalBlackLevelLumaCodeValue              ( m_nominalBlackLevelLumaCodeValue );
1061  m_cTEncTop.setTMISEINominalWhiteLevelLumaCodeValue              ( m_nominalWhiteLevelLumaCodeValue );
1062  m_cTEncTop.setTMISEIExtendedWhiteLevelLumaCodeValue             ( m_extendedWhiteLevelLumaCodeValue );
1063  m_cTEncTop.setChromaSamplingFilterHintEnabled                   ( m_chromaSamplingFilterSEIenabled );
1064  m_cTEncTop.setChromaSamplingHorFilterIdc                        ( m_chromaSamplingHorFilterIdc );
1065  m_cTEncTop.setChromaSamplingVerFilterIdc                        ( m_chromaSamplingVerFilterIdc );
1066  m_cTEncTop.setFramePackingArrangementSEIEnabled                 ( m_framePackingSEIEnabled );
1067  m_cTEncTop.setFramePackingArrangementSEIType                    ( m_framePackingSEIType );
1068  m_cTEncTop.setFramePackingArrangementSEIId                      ( m_framePackingSEIId );
1069  m_cTEncTop.setFramePackingArrangementSEIQuincunx                ( m_framePackingSEIQuincunx );
1070  m_cTEncTop.setFramePackingArrangementSEIInterpretation          ( m_framePackingSEIInterpretation );
1071  m_cTEncTop.setSegmentedRectFramePackingArrangementSEIEnabled    ( m_segmentedRectFramePackingSEIEnabled );
1072  m_cTEncTop.setSegmentedRectFramePackingArrangementSEICancel     ( m_segmentedRectFramePackingSEICancel );
1073  m_cTEncTop.setSegmentedRectFramePackingArrangementSEIType       ( m_segmentedRectFramePackingSEIType );
1074  m_cTEncTop.setSegmentedRectFramePackingArrangementSEIPersistence( m_segmentedRectFramePackingSEIPersistence );
1075  m_cTEncTop.setDisplayOrientationSEIAngle                        ( m_displayOrientationSEIAngle );
1076  m_cTEncTop.setTemporalLevel0IndexSEIEnabled                     ( m_temporalLevel0IndexSEIEnabled );
1077  m_cTEncTop.setGradualDecodingRefreshInfoEnabled                 ( m_gradualDecodingRefreshInfoEnabled );
1078  m_cTEncTop.setNoDisplaySEITLayer                                ( m_noDisplaySEITLayer );
1079  m_cTEncTop.setDecodingUnitInfoSEIEnabled                        ( m_decodingUnitInfoSEIEnabled );
1080  m_cTEncTop.setSOPDescriptionSEIEnabled                          ( m_SOPDescriptionSEIEnabled );
1081  m_cTEncTop.setScalableNestingSEIEnabled                         ( m_scalableNestingSEIEnabled );
1082  m_cTEncTop.setTMCTSSEIEnabled                                   ( m_tmctsSEIEnabled );
1083  m_cTEncTop.setTimeCodeSEIEnabled                                ( m_timeCodeSEIEnabled );
1084  m_cTEncTop.setNumberOfTimeSets                                  ( m_timeCodeSEINumTs );
1085  for(Int i = 0; i < m_timeCodeSEINumTs; i++) { m_cTEncTop.setTimeSet(m_timeSetArray[i], i); }
1086  m_cTEncTop.setKneeSEIEnabled                                    ( m_kneeSEIEnabled );
1087  m_cTEncTop.setKneeSEIId                                         ( m_kneeSEIId );
1088  m_cTEncTop.setKneeSEICancelFlag                                 ( m_kneeSEICancelFlag );
1089  m_cTEncTop.setKneeSEIPersistenceFlag                            ( m_kneeSEIPersistenceFlag );
1090  m_cTEncTop.setKneeSEIInputDrange                                ( m_kneeSEIInputDrange );
1091  m_cTEncTop.setKneeSEIInputDispLuminance                         ( m_kneeSEIInputDispLuminance );
1092  m_cTEncTop.setKneeSEIOutputDrange                               ( m_kneeSEIOutputDrange );
1093  m_cTEncTop.setKneeSEIOutputDispLuminance                        ( m_kneeSEIOutputDispLuminance );
1094  m_cTEncTop.setKneeSEINumKneePointsMinus1                        ( m_kneeSEINumKneePointsMinus1 );
1095  m_cTEncTop.setKneeSEIInputKneePoint                             ( m_kneeSEIInputKneePoint );
1096  m_cTEncTop.setKneeSEIOutputKneePoint                            ( m_kneeSEIOutputKneePoint );
1097  m_cTEncTop.setMasteringDisplaySEI                               ( m_masteringDisplay );
1098#if Q0074_COLOUR_REMAPPING_SEI
1099  m_cTEncTop.setCRISEIFile                       ( m_colourRemapSEIFile );
1100  m_cTEncTop.setCRISEIId                         ( m_colourRemapSEIId );
1101  m_cTEncTop.setCRISEICancelFlag                 ( m_colourRemapSEICancelFlag );
1102  m_cTEncTop.setCRISEIPersistenceFlag            ( m_colourRemapSEIPersistenceFlag );
1103  m_cTEncTop.setCRISEIVideoSignalInfoPresentFlag ( m_colourRemapSEIVideoSignalInfoPresentFlag );
1104  m_cTEncTop.setCRISEIFullRangeFlag              ( m_colourRemapSEIFullRangeFlag );
1105  m_cTEncTop.setCRISEIPrimaries                  ( m_colourRemapSEIPrimaries );
1106  m_cTEncTop.setCRISEITransferFunction           ( m_colourRemapSEITransferFunction );
1107  m_cTEncTop.setCRISEIMatrixCoefficients         ( m_colourRemapSEIMatrixCoefficients );
1108  m_cTEncTop.setCRISEIInputBitDepth              ( m_colourRemapSEIInputBitDepth );
1109  m_cTEncTop.setCRISEIBitDepth                   ( m_colourRemapSEIBitDepth );
1110  m_cTEncTop.setCRISEIPreLutNumValMinus1         ( m_colourRemapSEIPreLutNumValMinus1 );
1111  m_cTEncTop.setCRISEIPreLutCodedValue           ( m_colourRemapSEIPreLutCodedValue );
1112  m_cTEncTop.setCRISEIPreLutTargetValue          ( m_colourRemapSEIPreLutTargetValue );
1113  m_cTEncTop.setCRISEIMatrixPresentFlag          ( m_colourRemapSEIMatrixPresentFlag );
1114  m_cTEncTop.setCRISEILog2MatrixDenom            ( m_colourRemapSEILog2MatrixDenom );
1115  m_cTEncTop.setCRISEICoeffs                     ( m_colourRemapSEICoeffs );
1116  m_cTEncTop.setCRISEIPostLutNumValMinus1        ( m_colourRemapSEIPostLutNumValMinus1 );
1117  m_cTEncTop.setCRISEIPostLutCodedValue          ( m_colourRemapSEIPostLutCodedValue );
1118  m_cTEncTop.setCRISEIPostLutTargetValue         ( m_colourRemapSEIPostLutTargetValue );
1119#endif
1120#if LAYERS_NOT_PRESENT_SEI
1121  m_cTEncTop.setLayersNotPresentSEIEnabled( m_layersNotPresentSEIEnabled );
1122#endif
1123  m_cTEncTop.setTileUniformSpacingFlag                            ( m_tileUniformSpacingFlag );
1124  m_cTEncTop.setNumColumnsMinus1                                  ( m_numTileColumnsMinus1 );
1125  m_cTEncTop.setNumRowsMinus1                                     ( m_numTileRowsMinus1 );
1126  if(!m_tileUniformSpacingFlag)
1127  {
1128    m_cTEncTop.setColumnWidth                                     ( m_tileColumnWidth );
1129    m_cTEncTop.setRowHeight                                       ( m_tileRowHeight );
1130  }
1131  m_cTEncTop.xCheckGSParameters();
1132  Int uiTilesCount = (m_numTileRowsMinus1+1) * (m_numTileColumnsMinus1+1);
1133  if(uiTilesCount == 1)
1134  {
1135    m_bLFCrossTileBoundaryFlag = true;
1136  }
1137  m_cTEncTop.setLFCrossTileBoundaryFlag                           ( m_bLFCrossTileBoundaryFlag );
1138  m_cTEncTop.setWaveFrontSynchro                                  ( m_iWaveFrontSynchro );
1139  m_cTEncTop.setWaveFrontSubstreams                               ( m_iWaveFrontSubstreams );
1140  m_cTEncTop.setTMVPModeId                                        ( m_TMVPModeId );
1141  m_cTEncTop.setUseScalingListId                                  ( m_useScalingListId  );
1142  m_cTEncTop.setScalingListFile                                   ( m_scalingListFile   );
1143  m_cTEncTop.setSignHideFlag                                      ( m_signHideFlag);
1144  m_cTEncTop.setUseRateCtrl                                       ( m_RCEnableRateControl );
1145  m_cTEncTop.setTargetBitrate                                     ( m_RCTargetBitrate );
1146  m_cTEncTop.setKeepHierBit                                       ( m_RCKeepHierarchicalBit );
1147  m_cTEncTop.setLCULevelRC                                        ( m_RCLCULevelRC );
1148  m_cTEncTop.setUseLCUSeparateModel                               ( m_RCUseLCUSeparateModel );
1149  m_cTEncTop.setInitialQP                                         ( m_RCInitialQP );
1150  m_cTEncTop.setForceIntraQP                                      ( m_RCForceIntraQP );
1151  m_cTEncTop.setTransquantBypassEnableFlag                        ( m_TransquantBypassEnableFlag );
1152  m_cTEncTop.setCUTransquantBypassFlagForceValue                  ( m_CUTransquantBypassFlagForce );
1153  m_cTEncTop.setCostMode                                          ( m_costMode );
1154  m_cTEncTop.setUseRecalculateQPAccordingToLambda                 ( m_recalculateQPAccordingToLambda );
1155  m_cTEncTop.setUseStrongIntraSmoothing                           ( m_useStrongIntraSmoothing );
1156  m_cTEncTop.setActiveParameterSetsSEIEnabled                     ( m_activeParameterSetsSEIEnabled );
1157  m_cTEncTop.setVuiParametersPresentFlag                          ( m_vuiParametersPresentFlag );
1158  m_cTEncTop.setAspectRatioInfoPresentFlag                        ( m_aspectRatioInfoPresentFlag);
1159  m_cTEncTop.setAspectRatioIdc                                    ( m_aspectRatioIdc );
1160  m_cTEncTop.setSarWidth                                          ( m_sarWidth );
1161  m_cTEncTop.setSarHeight                                         ( m_sarHeight );
1162  m_cTEncTop.setOverscanInfoPresentFlag                           ( m_overscanInfoPresentFlag );
1163  m_cTEncTop.setOverscanAppropriateFlag                           ( m_overscanAppropriateFlag );
1164  m_cTEncTop.setVideoSignalTypePresentFlag                        ( m_videoSignalTypePresentFlag );
1165  m_cTEncTop.setVideoFormat                                       ( m_videoFormat );
1166  m_cTEncTop.setVideoFullRangeFlag                                ( m_videoFullRangeFlag );
1167  m_cTEncTop.setColourDescriptionPresentFlag                      ( m_colourDescriptionPresentFlag );
1168  m_cTEncTop.setColourPrimaries                                   ( m_colourPrimaries );
1169  m_cTEncTop.setTransferCharacteristics                           ( m_transferCharacteristics );
1170  m_cTEncTop.setMatrixCoefficients                                ( m_matrixCoefficients );
1171  m_cTEncTop.setChromaLocInfoPresentFlag                          ( m_chromaLocInfoPresentFlag );
1172  m_cTEncTop.setChromaSampleLocTypeTopField                       ( m_chromaSampleLocTypeTopField );
1173  m_cTEncTop.setChromaSampleLocTypeBottomField                    ( m_chromaSampleLocTypeBottomField );
1174  m_cTEncTop.setNeutralChromaIndicationFlag                       ( m_neutralChromaIndicationFlag );
1175  m_cTEncTop.setDefaultDisplayWindow                              ( m_defDispWinLeftOffset, m_defDispWinRightOffset, m_defDispWinTopOffset, m_defDispWinBottomOffset );
1176  m_cTEncTop.setFrameFieldInfoPresentFlag                         ( m_frameFieldInfoPresentFlag );
1177  m_cTEncTop.setPocProportionalToTimingFlag                       ( m_pocProportionalToTimingFlag );
1178  m_cTEncTop.setNumTicksPocDiffOneMinus1                          ( m_numTicksPocDiffOneMinus1    );
1179  m_cTEncTop.setBitstreamRestrictionFlag                          ( m_bitstreamRestrictionFlag );
1180  m_cTEncTop.setTilesFixedStructureFlag                           ( m_tilesFixedStructureFlag );
1181  m_cTEncTop.setMotionVectorsOverPicBoundariesFlag                ( m_motionVectorsOverPicBoundariesFlag );
1182  m_cTEncTop.setMinSpatialSegmentationIdc                         ( m_minSpatialSegmentationIdc );
1183  m_cTEncTop.setMaxBytesPerPicDenom                               ( m_maxBytesPerPicDenom );
1184  m_cTEncTop.setMaxBitsPerMinCuDenom                              ( m_maxBitsPerMinCuDenom );
1185  m_cTEncTop.setLog2MaxMvLengthHorizontal                         ( m_log2MaxMvLengthHorizontal );
1186  m_cTEncTop.setLog2MaxMvLengthVertical                           ( m_log2MaxMvLengthVertical );
1187}
1188#endif //SVC_EXTENSION
1189
1190Void TAppEncTop::xCreateLib()
1191{
1192  // Video I/O
1193#if SVC_EXTENSION
1194  // initialize global variables
1195  initROM();
1196
1197  for(UInt layer=0; layer<m_numLayers; layer++)
1198  {
1199#if O0194_DIFFERENT_BITDEPTH_EL_BL
1200    //2
1201    for( UInt channelTypeIndex = 0; channelTypeIndex < MAX_NUM_CHANNEL_TYPE; channelTypeIndex++)
1202    {
1203      g_bitDepth[channelTypeIndex]    = m_acLayerCfg[layer].m_internalBitDepth[channelTypeIndex];
1204      g_PCMBitDepth[channelTypeIndex] = m_bPCMInputBitDepthFlag ? m_acLayerCfg[layer].m_inputBitDepth[channelTypeIndex] : m_acLayerCfg[layer].m_internalBitDepth[channelTypeIndex];
1205    }
1206#endif
1207#if LAYER_CTB
1208    g_uiMaxCUWidth  = g_auiLayerMaxCUWidth[layer];
1209    g_uiMaxCUHeight = g_auiLayerMaxCUHeight[layer];
1210    g_uiMaxCUDepth  = g_auiLayerMaxCUDepth[layer];
1211    g_uiAddCUDepth  = g_auiLayerAddCUDepth[layer];
1212#endif
1213    // Video I/O
1214#if O0194_DIFFERENT_BITDEPTH_EL_BL
1215    m_acTVideoIOYuvInputFile[layer].open( (Char *)m_acLayerCfg[layer].getInputFile().c_str(),  false, m_acLayerCfg[layer].m_inputBitDepth, m_acLayerCfg[layer].m_MSBExtendedBitDepth, m_acLayerCfg[layer].m_internalBitDepth );  // read  mode
1216#else
1217    m_acTVideoIOYuvInputFile[layer].open( (Char *)m_acLayerCfg[layer].getInputFile().c_str(),  false, m_inputBitDepth, m_MSBExtendedBitDepth, m_internalBitDepth );  // read  mode
1218#endif
1219    m_acTVideoIOYuvInputFile[layer].skipFrames(m_FrameSkip, m_acLayerCfg[layer].getSourceWidth() - m_acLayerCfg[layer].getPad()[0], m_acLayerCfg[layer].getSourceHeight() - m_acLayerCfg[layer].getPad()[1], m_acLayerCfg[layer].m_InputChromaFormatIDC);
1220
1221    if (!m_acLayerCfg[layer].getReconFile().empty())
1222    {
1223#if O0194_DIFFERENT_BITDEPTH_EL_BL
1224      m_acTVideoIOYuvReconFile[layer].open((Char *)m_acLayerCfg[layer].getReconFile().c_str(), true, m_acLayerCfg[layer].m_outputBitDepth, m_acLayerCfg[layer].m_MSBExtendedBitDepth, m_acLayerCfg[layer].m_internalBitDepth );  // write mode
1225#else
1226      m_acTVideoIOYuvReconFile[layer].open((Char *)m_acLayerCfg[layer].getReconFile().c_str(), true, m_outputBitDepth, m_MSBExtendedBitDepth, m_internalBitDepth );  // write mode
1227#endif
1228    }
1229
1230    // Neo Decoder
1231    m_acTEncTop[layer].create();
1232  }
1233#else //SVC_EXTENSION
1234  // Video I/O
1235  m_cTVideoIOYuvInputFile.open( m_pchInputFile,     false, m_inputBitDepth, m_MSBExtendedBitDepth, m_internalBitDepth );  // read  mode
1236  m_cTVideoIOYuvInputFile.skipFrames(m_FrameSkip, m_iSourceWidth - m_aiPad[0], m_iSourceHeight - m_aiPad[1], m_InputChromaFormatIDC);
1237
1238  if (m_pchReconFile)
1239  {
1240    m_cTVideoIOYuvReconFile.open(m_pchReconFile, true, m_outputBitDepth, m_outputBitDepth, m_internalBitDepth);  // write mode
1241  }
1242
1243  // Neo Decoder
1244  m_cTEncTop.create();
1245#endif //SVC_EXTENSION
1246}
1247
1248Void TAppEncTop::xDestroyLib()
1249{
1250  // Video I/O
1251#if SVC_EXTENSION
1252  // destroy ROM
1253  destroyROM();
1254
1255  for(UInt layer=0; layer<m_numLayers; layer++)
1256  {
1257#if LAYER_CTB
1258    g_uiMaxCUWidth  = g_auiLayerMaxCUWidth[layer];
1259    g_uiMaxCUHeight = g_auiLayerMaxCUHeight[layer];
1260    g_uiMaxCUDepth  = g_auiLayerMaxCUDepth[layer];
1261    g_uiAddCUDepth  = g_auiLayerAddCUDepth[layer];
1262#endif
1263
1264    m_acTVideoIOYuvInputFile[layer].close();
1265    m_acTVideoIOYuvReconFile[layer].close();
1266
1267    m_acTEncTop[layer].destroy();
1268  }
1269#else //SVC_EXTENSION
1270  m_cTVideoIOYuvInputFile.close();
1271  m_cTVideoIOYuvReconFile.close();
1272
1273  // Neo Decoder
1274  m_cTEncTop.destroy();
1275#endif //SVC_EXTENSION
1276}
1277
1278Void TAppEncTop::xInitLib(Bool isFieldCoding)
1279{
1280#if SVC_EXTENSION
1281  TComVPS* vps = m_acTEncTop[0].getVPS();
1282  m_acTEncTop[0].getVPS()->setMaxLayers( m_numLayers );
1283
1284  UInt i = 0, dimIdLen = 0;
1285
1286  while((1 << dimIdLen) < m_numLayers)
1287  {
1288    dimIdLen++;
1289  }
1290  vps->setDimensionIdLen(0, dimIdLen);
1291  vps->setNuhLayerIdPresentFlag(false);
1292  vps->setLayerIdInNuh(0, 0);
1293  vps->setLayerIdxInVps(0, 0);
1294  for(i = 1; i < vps->getMaxLayers(); i++)
1295  {
1296    vps->setLayerIdInNuh(i, m_acLayerCfg[i].m_layerId);   
1297    vps->setLayerIdxInVps(vps->getLayerIdInNuh(i), i);
1298    vps->setDimensionId(i, 0, i);
1299
1300    if( m_acLayerCfg[i].m_layerId != i )
1301    {
1302      vps->setNuhLayerIdPresentFlag(true);
1303    }
1304  }
1305
1306  for(UInt layer=0; layer<m_numLayers; layer++)
1307  {
1308#if O0194_DIFFERENT_BITDEPTH_EL_BL
1309    //3
1310    for (UInt channelTypeIndex = 0; channelTypeIndex < MAX_NUM_CHANNEL_TYPE; channelTypeIndex++)
1311    {
1312      g_bitDepth[channelTypeIndex]    = m_acLayerCfg[layer].m_internalBitDepth[channelTypeIndex];
1313      g_PCMBitDepth[channelTypeIndex] = m_bPCMInputBitDepthFlag ? m_acLayerCfg[layer].m_inputBitDepth[channelTypeIndex] : m_acLayerCfg[layer].m_internalBitDepth[channelTypeIndex];
1314    }
1315#endif
1316#if LAYER_CTB
1317    g_uiMaxCUWidth  = g_auiLayerMaxCUWidth[layer];
1318    g_uiMaxCUHeight = g_auiLayerMaxCUHeight[layer];
1319    g_uiMaxCUDepth  = g_auiLayerMaxCUDepth[layer];
1320    g_uiAddCUDepth  = g_auiLayerAddCUDepth[layer];
1321
1322    memcpy( g_auiZscanToRaster, g_auiLayerZscanToRaster[layer], sizeof( g_auiZscanToRaster ) );
1323    memcpy( g_auiRasterToZscan, g_auiLayerRasterToZscan[layer], sizeof( g_auiRasterToZscan ) );
1324    memcpy( g_auiRasterToPelX,  g_auiLayerRasterToPelX[layer],  sizeof( g_auiRasterToPelX ) );
1325    memcpy( g_auiRasterToPelY,  g_auiLayerRasterToPelY[layer],  sizeof( g_auiRasterToPelY ) );
1326#endif
1327    m_acTEncTop[layer].init(isFieldCoding);
1328  }
1329
1330#if VPS_EXTN_OP_LAYER_SETS
1331  vps->setMaxLayerId( m_acLayerCfg[m_numLayers - 1].m_layerId );    // Set max-layer ID
1332
1333  vps->setVpsExtensionFlag( m_numLayers > 1 ? true : false );
1334
1335#if Q0078_ADD_LAYER_SETS
1336#if OUTPUT_LAYER_SETS_CONFIG
1337  if (m_numLayerSets > 1)
1338  {
1339    vps->setNumLayerSets(m_numLayerSets);
1340#else
1341  if (m_numLayerSets > 0)
1342  {
1343    vps->setNumLayerSets(m_numLayerSets+1);
1344#endif
1345    for (Int setId = 1; setId < vps->getNumLayerSets(); setId++)
1346    {
1347      for (Int layerId = 0; layerId <= vps->getMaxLayerId(); layerId++)
1348      {
1349        vps->setLayerIdIncludedFlag(false, setId, layerId);
1350      }
1351    }
1352    for (Int setId = 1; setId < vps->getNumLayerSets(); setId++)
1353    {
1354#if OUTPUT_LAYER_SETS_CONFIG
1355      for( i = 0; i < m_numLayerInIdList[setId]; i++ )
1356      {
1357        Int layerId = m_layerSetLayerIdList[setId][i];
1358        Int layerIdx = vps->getLayerIdxInVps(m_layerSetLayerIdList[setId][i]);
1359#else
1360      for( i = 0; i < m_numLayerInIdList[setId-1]; i++ )
1361      {
1362        Int layerId = m_layerSetLayerIdList[setId-1][i];
1363#endif
1364#if O0194_DIFFERENT_BITDEPTH_EL_BL
1365        //4
1366        g_bitDepth[CHANNEL_TYPE_LUMA]   = m_acLayerCfg[layerIdx].m_internalBitDepth[CHANNEL_TYPE_LUMA];
1367        g_bitDepth[CHANNEL_TYPE_CHROMA] = m_acLayerCfg[layerIdx].m_internalBitDepth[CHANNEL_TYPE_CHROMA];
1368
1369        g_PCMBitDepth[CHANNEL_TYPE_LUMA]   = m_bPCMInputBitDepthFlag ? m_acLayerCfg[layerIdx].m_inputBitDepth[CHANNEL_TYPE_LUMA]   : m_acLayerCfg[layerIdx].m_internalBitDepth[CHANNEL_TYPE_LUMA];
1370        g_PCMBitDepth[CHANNEL_TYPE_CHROMA] = m_bPCMInputBitDepthFlag ? m_acLayerCfg[layerIdx].m_inputBitDepth[CHANNEL_TYPE_CHROMA] : m_acLayerCfg[layerIdx].m_internalBitDepth[CHANNEL_TYPE_CHROMA];
1371#endif
1372
1373        vps->setLayerIdIncludedFlag(true, setId, layerId);
1374      }
1375    }
1376  }
1377  else
1378  {
1379    // Default layer sets
1380#endif
1381    vps->setNumLayerSets(m_numLayers);
1382    for (Int setId = 1; setId < vps->getNumLayerSets(); setId++)
1383    {
1384      for (Int layerIdx = 0; layerIdx <= vps->getMaxLayers(); layerIdx++)
1385      {
1386#if O0194_DIFFERENT_BITDEPTH_EL_BL
1387        //4
1388        UInt layerId = vps->getLayerIdInNuh(layerIdx);
1389        g_bitDepth[CHANNEL_TYPE_LUMA]   = m_acLayerCfg[layerIdx].m_internalBitDepth[CHANNEL_TYPE_LUMA];
1390        g_bitDepth[CHANNEL_TYPE_CHROMA] = m_acLayerCfg[layerIdx].m_internalBitDepth[CHANNEL_TYPE_CHROMA];
1391
1392        g_PCMBitDepth[CHANNEL_TYPE_LUMA]   = m_bPCMInputBitDepthFlag ? m_acLayerCfg[layerIdx].m_inputBitDepth[CHANNEL_TYPE_LUMA]   : m_acLayerCfg[layerIdx].m_internalBitDepth[CHANNEL_TYPE_LUMA];
1393        g_PCMBitDepth[CHANNEL_TYPE_CHROMA] = m_bPCMInputBitDepthFlag ? m_acLayerCfg[layerIdx].m_inputBitDepth[CHANNEL_TYPE_CHROMA] : m_acLayerCfg[layerIdx].m_internalBitDepth[CHANNEL_TYPE_CHROMA];
1394#endif
1395        if (layerId <= setId)
1396        {
1397          vps->setLayerIdIncludedFlag(true, setId, layerId);
1398        }
1399        else
1400        {
1401          vps->setLayerIdIncludedFlag(false, setId, layerId);
1402        }
1403      }
1404    }
1405#if Q0078_ADD_LAYER_SETS
1406  }
1407#endif
1408#if Q0078_ADD_LAYER_SETS
1409  vps->setVpsNumLayerSetsMinus1(vps->getNumLayerSets() - 1);
1410  vps->setNumAddLayerSets(m_numAddLayerSets);
1411  vps->setNumLayerSets(vps->getNumLayerSets() + vps->getNumAddLayerSets());
1412  if (m_numAddLayerSets > 0)
1413  {
1414    for (Int setId = 0; setId < m_numAddLayerSets; setId++)
1415    {
1416      for (Int j = 0; j < m_numHighestLayerIdx[setId]; j++)
1417      {
1418        vps->setHighestLayerIdxPlus1(setId, j + 1, m_highestLayerIdx[setId][j] + 1);
1419      }
1420    }
1421  }
1422#endif
1423#if VPS_EXTN_MASK_AND_DIM_INFO
1424#if AVC_BASE
1425#if VPS_AVC_BL_FLAG_REMOVAL
1426  vps->setNonHEVCBaseLayerFlag( m_nonHEVCBaseLayerFlag );
1427  if ( m_nonHEVCBaseLayerFlag )
1428  {
1429    vps->setBaseLayerInternalFlag (false);
1430  }
1431#else
1432  vps->setAvcBaseLayerFlag(m_avcBaseLayerFlag);
1433#endif
1434#else
1435  vps->setAvcBaseLayerFlag(false);
1436#endif
1437  vps->setSplittingFlag(false);
1438  for(i = 0; i < MAX_VPS_NUM_SCALABILITY_TYPES; i++)
1439  {
1440    vps->setScalabilityMask(i, false);
1441  }
1442  if(m_numLayers > 1)
1443  {
1444    Int scalabilityTypes = 0;
1445    for(i = 0; i < MAX_VPS_NUM_SCALABILITY_TYPES; i++)
1446    {
1447      vps->setScalabilityMask(i, m_scalabilityMask[i]);
1448      scalabilityTypes += m_scalabilityMask[i];
1449    }
1450#if AUXILIARY_PICTURES
1451    assert( scalabilityTypes <= 2 );
1452#else
1453    assert( scalabilityTypes == 1 );
1454#endif
1455    vps->setNumScalabilityTypes(scalabilityTypes);
1456  }
1457  else
1458  {
1459    vps->setNumScalabilityTypes(0);
1460  }
1461 
1462#if AUXILIARY_PICTURES
1463  if (m_scalabilityMask[AUX_ID])
1464  {
1465    UInt maxAuxId = 0;
1466    UInt auxDimIdLen = 1;
1467    Int  auxId = vps->getNumScalabilityTypes() - 1;
1468    for(i = 1; i < vps->getMaxLayers(); i++)
1469    {
1470      if (m_acLayerCfg[i].getAuxId() > maxAuxId)
1471      {
1472        maxAuxId = m_acLayerCfg[i].getAuxId();
1473      }
1474    }
1475    while((1 << auxDimIdLen) < (maxAuxId + 1))
1476    {
1477      auxDimIdLen++;
1478    }
1479    vps->setDimensionIdLen(auxId, auxDimIdLen);
1480    for(i = 1; i < vps->getMaxLayers(); i++)
1481    {
1482      vps->setDimensionId(i, auxId, m_acLayerCfg[i].getAuxId());
1483    }
1484  }
1485#endif
1486#endif
1487#if VPS_TSLAYERS
1488  vps->setMaxTSLayersPresentFlag(true);
1489
1490  for( i = 0; i < vps->getMaxLayers(); i++ )
1491  {
1492    vps->setMaxTSLayersMinus1(i, vps->getMaxTLayers()-1);
1493  }
1494#endif
1495  vps->setMaxTidRefPresentFlag(m_maxTidRefPresentFlag);
1496  if (vps->getMaxTidRefPresentFlag())
1497  {
1498    for( i = 0; i < vps->getMaxLayers() - 1; i++ )
1499    {
1500#if O0225_MAX_TID_FOR_REF_LAYERS
1501      for( Int j = i+1; j < vps->getMaxLayers(); j++)
1502      {
1503        vps->setMaxTidIlRefPicsPlus1(i, j, m_acTEncTop[i].getMaxTidIlRefPicsPlus1());
1504      }
1505#else
1506      vps->setMaxTidIlRefPicsPlus1(i, m_acTEncTop[i].getMaxTidIlRefPicsPlus1());
1507#endif
1508    }
1509  }
1510  else
1511  {
1512    for( i = 0; i < vps->getMaxLayers() - 1; i++ )
1513    {
1514#if O0225_MAX_TID_FOR_REF_LAYERS
1515      for( Int j = i+1; j < vps->getMaxLayers(); j++)
1516      {
1517        vps->setMaxTidIlRefPicsPlus1(i, j, 7);
1518      }
1519#else
1520      vps->setMaxTidIlRefPicsPlus1(i, 7);
1521#endif
1522    }
1523  }
1524    vps->setIlpSshSignalingEnabledFlag(false);
1525#if VPS_EXTN_PROFILE_INFO
1526#if !MULTIPLE_PTL_SUPPORT
1527#if LIST_OF_PTL
1528  vps->getPTLForExtnPtr()->resize(1);   // Dummy object - unused.
1529  for(i = 0; i < vps->getMaxLayers(); i++)
1530  {
1531    // TODO: The profile tier level have to be given support to be included in the configuration files
1532    if(i == 0)
1533    {
1534      if( vps->getBaseLayerInternalFlag() && vps->getMaxLayers() > 1 )
1535      {
1536        vps->setProfilePresentFlag(1, false);
1537        vps->getPTLForExtnPtr()->push_back( *(m_acTEncTop[0].getSPS()->getPTL()) );
1538      }
1539    }
1540    else  // i > 0
1541    {
1542      vps->setProfilePresentFlag(i, true);
1543      // Note - may need to be changed for other layer structures.
1544      vps->getPTLForExtnPtr()->push_back( *(m_acTEncTop[0].getSPS()->getPTL()) );
1545    }
1546  }
1547#else
1548  vps->getPTLForExtnPtr()->resize(vps->getNumLayerSets());
1549  for(Int setId = 1; setId < vps->getNumLayerSets(); setId++)
1550  {
1551    vps->setProfilePresentFlag(setId, true);
1552    // Note - may need to be changed for other layer structures.
1553    *(vps->getPTLForExtn(setId)) = *(m_acTEncTop[setId].getSPS()->getPTL());
1554  }
1555#endif
1556#endif
1557#endif
1558#if VPS_EXTN_DIRECT_REF_LAYERS
1559  // Direct reference layers
1560  UInt maxDirectRefLayers = 0;
1561#if O0096_DEFAULT_DEPENDENCY_TYPE
1562  Bool isDefaultDirectDependencyTypeSet = false;
1563#endif
1564  for (UInt layerCtr = 1; layerCtr < vps->getMaxLayers(); layerCtr++)
1565  {
1566    UInt layerId = vps->getLayerIdInNuh(layerCtr);
1567    vps->setNumDirectRefLayers(layerId, m_acTEncTop[layerCtr].getNumDirectRefLayers());
1568    maxDirectRefLayers = max<UInt>(maxDirectRefLayers, vps->getNumDirectRefLayers(layerId));
1569
1570    for (i = 0; i < vps->getNumDirectRefLayers(layerId); i++)
1571    {
1572      vps->setRefLayerId(layerId, i, m_acTEncTop[layerCtr].getRefLayerId(i));
1573    }
1574    // Set direct dependency flag
1575    // Initialize flag to 0
1576    for (Int refLayerCtr = 0; refLayerCtr < layerCtr; refLayerCtr++)
1577    {
1578      vps->setDirectDependencyFlag(layerCtr, refLayerCtr, false);
1579    }
1580    for (i = 0; i < vps->getNumDirectRefLayers(layerId); i++)
1581    {
1582      vps->setDirectDependencyFlag(layerCtr, vps->getLayerIdxInVps(m_acTEncTop[layerCtr].getRefLayerId(i)), true);
1583    }
1584    // prediction indications
1585    vps->setDirectDepTypeLen(2); // sample and motion types are encoded
1586    for (Int refLayerCtr = 0; refLayerCtr < layerCtr; refLayerCtr++)
1587    {
1588      if (vps->getDirectDependencyFlag(layerCtr, refLayerCtr))
1589      {
1590        assert(m_acTEncTop[layerCtr].getSamplePredEnabledFlag(refLayerCtr) || m_acTEncTop[layerCtr].getMotionPredEnabledFlag(refLayerCtr));
1591        vps->setDirectDependencyType(layerCtr, refLayerCtr, ((m_acTEncTop[layerCtr].getSamplePredEnabledFlag(refLayerCtr) ? 1 : 0) |
1592          (m_acTEncTop[layerCtr].getMotionPredEnabledFlag(refLayerCtr) ? 2 : 0)) - 1);
1593#if O0096_DEFAULT_DEPENDENCY_TYPE
1594        if (!isDefaultDirectDependencyTypeSet)
1595        {
1596          vps->setDefaultDirectDependecyTypeFlag(1);
1597          vps->setDefaultDirectDependecyType(vps->getDirectDependencyType(layerCtr, refLayerCtr));
1598          isDefaultDirectDependencyTypeSet = true;
1599        }
1600        else if (vps->getDirectDependencyType(layerCtr, refLayerCtr) != vps->getDefaultDirectDependencyType())
1601        {
1602          vps->setDefaultDirectDependecyTypeFlag(0);
1603        }
1604#endif
1605      }
1606      else
1607      {
1608        vps->setDirectDependencyType(layerCtr, refLayerCtr, 0);
1609      }
1610    }
1611  }
1612
1613#if O0092_0094_DEPENDENCY_CONSTRAINT
1614  vps->setNumRefLayers();
1615
1616  if (vps->getMaxLayers() > MAX_REF_LAYERS)
1617  {
1618    for (UInt layerCtr = 1; layerCtr <= vps->getMaxLayers() - 1; layerCtr++)
1619    {
1620      assert(vps->getNumRefLayers(vps->getLayerIdInNuh(layerCtr)) <= MAX_REF_LAYERS);
1621    }
1622  }
1623#endif
1624#if FIX_LAYER_ID_INIT
1625  // The Layer ID List variables should be derived here.
1626#if DERIVE_LAYER_ID_LIST_VARIABLES
1627  vps->deriveLayerIdListVariables();
1628#endif
1629#endif
1630#if Q0078_ADD_LAYER_SETS
1631  vps->setPredictedLayerIds();
1632  vps->setTreePartitionLayerIdList();
1633#if FIX_LAYER_ID_INIT
1634  vps->deriveLayerIdListVariablesForAddLayerSets();
1635#else
1636  vps->setLayerIdIncludedFlagsForAddLayerSets();
1637#endif
1638#endif
1639#endif
1640#if OUTPUT_LAYER_SETS_CONFIG
1641
1642  vps->setDefaultTargetOutputLayerIdc( m_defaultTargetOutputLayerIdc ); // As per configuration file
1643
1644  if( m_numOutputLayerSets == -1 )  // # of output layer sets not specified in the configuration file
1645  {
1646    vps->setNumOutputLayerSets(vps->getNumLayerSets());
1647
1648    for(i = 1; i < vps->getNumLayerSets(); i++)
1649    {
1650        vps->setOutputLayerSetIdx(i, i);
1651    }
1652  }
1653  else
1654  {
1655    vps->setNumOutputLayerSets( m_numOutputLayerSets );
1656    for( Int olsCtr = 0; olsCtr < vps->getNumLayerSets(); olsCtr ++ ) // Default output layer sets
1657    {
1658      vps->setOutputLayerSetIdx(olsCtr, olsCtr);
1659    }
1660    for( Int olsCtr = vps->getNumLayerSets(); olsCtr < vps->getNumOutputLayerSets(); olsCtr ++ )  // Non-default output layer sets
1661    {
1662      vps->setOutputLayerSetIdx(olsCtr, m_outputLayerSetIdx[olsCtr - vps->getNumLayerSets()]);
1663    }
1664  }
1665#endif
1666  // Target output layer
1667#if !MULTIPLE_PTL_SUPPORT
1668#if LIST_OF_PTL
1669  vps->setNumProfileTierLevel( vps->getPTLForExtnPtr()->size() ); // +1 for the base VPS PTL()
1670#else
1671  vps->setNumOutputLayerSets(vps->getNumLayerSets());
1672  vps->setNumProfileTierLevel(vps->getNumLayerSets());
1673#endif
1674#endif
1675#if !OUTPUT_LAYER_SETS_CONFIG // Taken care by configuration file parameter
1676#if P0295_DEFAULT_OUT_LAYER_IDC
1677  vps->setDefaultTargetOutputLayerIdc(1);
1678#else
1679#if O0109_DEFAULT_ONE_OUT_LAYER_IDC
1680  vps->setDefaultOneTargetOutputLayerIdc(1);
1681#else
1682  vps->setDefaultOneTargetOutputLayerFlag(true);
1683#endif
1684#endif
1685#endif
1686#if !PER_LAYER_PTL
1687  for(i = 1; i < vps->getNumLayerSets(); i++)
1688  {
1689    vps->setProfileLevelTierIdx(i, i);
1690#if !OUTPUT_LAYER_SETS_CONFIG
1691    vps->setOutputLayerSetIdx(i, i);
1692#endif
1693  } 
1694#endif
1695#endif
1696 #if VPS_DPB_SIZE_TABLE
1697#if !FIX_LAYER_ID_INIT  // must be derived earlier to not delete additional layer sets
1698  // The Layer ID List variables can be derived here. 
1699#if DERIVE_LAYER_ID_LIST_VARIABLES
1700  vps->deriveLayerIdListVariables();
1701#endif
1702#endif
1703#if RESOLUTION_BASED_DPB
1704  vps->assignSubDpbIndices();
1705#else
1706  vps->deriveNumberOfSubDpbs();
1707#endif
1708  vps->setOutputLayerFlag( 0, 0, 1 );
1709
1710  // derive OutputLayerFlag[i][j]
1711#if !OUTPUT_LAYER_SETS_CONFIG
1712  if( vps->getDefaultTargetOutputLayerIdc() == 1 )
1713#endif
1714  {
1715    // default_output_layer_idc equal to 1 specifies that only the layer with the highest value of nuh_layer_id such that nuh_layer_id equal to nuhLayerIdA and
1716    // AuxId[ nuhLayerIdA ] equal to 0 in each of the output layer sets with index in the range of 1 to vps_num_layer_sets_minus1, inclusive, is an output layer of its output layer set.
1717
1718    // Include the highest layer as output layer for each layer set
1719    for(Int lsIdx = 1; lsIdx <= vps->getVpsNumLayerSetsMinus1(); lsIdx++)
1720    {
1721      for( UInt layer = 0; layer < vps->getNumLayersInIdList(lsIdx); layer++ )
1722      {
1723#if !Q0078_ADD_LAYER_SETS  // the following condition is incorrect and is not needed anyway
1724        if( vps->getLayerIdIncludedFlag(lsIdx, layer) )     
1725#endif
1726        {
1727#if OUTPUT_LAYER_SETS_CONFIG
1728          switch(vps->getDefaultTargetOutputLayerIdc())
1729          {
1730            case 0: vps->setOutputLayerFlag( lsIdx, layer, 1 );
1731              break;
1732            case 1: vps->setOutputLayerFlag( lsIdx, layer, layer == vps->getNumLayersInIdList(lsIdx) - 1 );
1733              break;
1734            case 2:
1735            case 3: vps->setOutputLayerFlag( lsIdx, layer, (layer != vps->getNumLayersInIdList(lsIdx) - 1) ? std::find( m_listOfOutputLayers[lsIdx].begin(), m_listOfOutputLayers[lsIdx].end(), m_layerSetLayerIdList[lsIdx][layer]) != m_listOfOutputLayers[lsIdx].end() 
1736                                                                                                           : m_listOfOutputLayers[lsIdx][m_listOfOutputLayers[lsIdx].size()-1] == m_layerSetLayerIdList[lsIdx][layer] );
1737              break;
1738          }
1739#else
1740          vps->setOutputLayerFlag( lsIdx, layer, layer == vps->getNumLayersInIdList(lsIdx) - 1 );
1741#endif
1742        }
1743      }
1744    }
1745#if OUTPUT_LAYER_SETS_CONFIG
1746    for( Int olsIdx = vps->getVpsNumLayerSetsMinus1() + 1; olsIdx < vps->getNumOutputLayerSets(); olsIdx++ )
1747    {
1748      for( UInt layer = 0; layer < vps->getNumLayersInIdList(vps->getOutputLayerSetIdx(olsIdx)); layer++ )
1749      {
1750        vps->setOutputLayerFlag( olsIdx, layer, (layer != vps->getNumLayersInIdList(vps->getOutputLayerSetIdx(olsIdx)) - 1) ? std::find( m_listOfOutputLayers[olsIdx].begin(), m_listOfOutputLayers[olsIdx].end(), vps->getLayerSetLayerIdList(vps->getOutputLayerSetIdx(olsIdx), layer)) != m_listOfOutputLayers[olsIdx].end()
1751                                                                                                                            : m_listOfOutputLayers[olsIdx][m_listOfOutputLayers[olsIdx].size()-1] == vps->getLayerSetLayerIdList(vps->getOutputLayerSetIdx(olsIdx), layer) );
1752      }
1753    }
1754#endif
1755  }
1756#if !OUTPUT_LAYER_SETS_CONFIG
1757  else
1758  {
1759    // cases when default_output_layer_idc is not equal to 1
1760    assert(!"default_output_layer_idc not equal to 1 is not yet supported");
1761  }
1762#endif
1763#if NECESSARY_LAYER_FLAG
1764  vps->deriveNecessaryLayerFlag();
1765  vps->checkNecessaryLayerFlagCondition();
1766#endif
1767#if !MULTIPLE_PTL_SUPPORT
1768#if PER_LAYER_PTL
1769  vps->getProfileLevelTierIdx()->resize(vps->getNumOutputLayerSets());
1770  vps->getProfileLevelTierIdx(0)->push_back( vps->getBaseLayerInternalFlag() && vps->getMaxLayers() > 1 ? 1 : 0 ); // Default 0-th output layer set
1771  for(i = 1; i < vps->getNumOutputLayerSets(); i++)
1772  {
1773    Int layerSetIdxForOutputLayerSet = vps->getOutputLayerSetIdx( i );
1774    Int numLayerInLayerSet = vps->getNumLayersInIdList( layerSetIdxForOutputLayerSet );
1775    for(Int j = 0; j < numLayerInLayerSet; j++)
1776    {
1777      Int layerIdxInVps = vps->getLayerIdxInVps( vps->getLayerSetLayerIdList(layerSetIdxForOutputLayerSet, j) );
1778      if( vps->getNecessaryLayerFlag(i, j) )
1779      {
1780        vps->getProfileLevelTierIdx(i)->push_back( vps->getBaseLayerInternalFlag() && vps->getMaxLayers() > 1 ? layerIdxInVps + 1 : layerIdxInVps);
1781      }
1782      else
1783      {
1784        vps->getProfileLevelTierIdx(i)->push_back( -1 );
1785      }
1786    }
1787  }
1788#endif
1789#endif
1790#if SUB_LAYERS_IN_LAYER_SET
1791  vps->calculateMaxSLInLayerSets();
1792#endif
1793  // Initialize dpb_size_table() for all ouput layer sets in the VPS extension
1794  for(i = 1; i < vps->getNumOutputLayerSets(); i++)
1795  {
1796#if CHANGE_NUMSUBDPB_IDX
1797    Int layerSetIdxForOutputLayerSet = vps->getOutputLayerSetIdx( i );
1798#endif
1799    Int layerSetId = vps->getOutputLayerSetIdx(i);
1800
1801    for(Int j = 0; j < vps->getMaxTLayers(); j++)
1802    {
1803
1804      Int maxNumReorderPics = -1;
1805#if CHANGE_NUMSUBDPB_IDX
1806#if RESOLUTION_BASED_DPB
1807      for(Int k = 0; k < vps->getNumLayersInIdList(layerSetIdxForOutputLayerSet); k++)
1808#else
1809      for(Int k = 0; k < vps->getNumSubDpbs(layerSetIdxForOutputLayerSet); k++)
1810#endif
1811#else
1812      for(Int k = 0; k < vps->getNumSubDpbs(i); k++)
1813#endif
1814      {
1815        Int layerId = vps->getLayerSetLayerIdList(layerSetId, k); // k-th layer in the output layer set
1816#if RESOLUTION_BASED_DPB
1817        vps->setMaxVpsLayerDecPicBuffMinus1( i, k, j, m_acTEncTop[layerId].getMaxDecPicBuffering(j) - 1 );
1818        // Add sub-DPB sizes of layers belonging to a sub-DPB. If a different sub-DPB size is calculated
1819        // at the encoder, modify below
1820        Int oldValue = vps->getMaxVpsDecPicBufferingMinus1( i, vps->getSubDpbAssigned( layerSetIdxForOutputLayerSet, k ), j );
1821        oldValue += vps->getMaxVpsLayerDecPicBuffMinus1( i, k, j ) + 1;
1822        vps->setMaxVpsDecPicBufferingMinus1( i, vps->getSubDpbAssigned( layerSetIdxForOutputLayerSet, k ), j, oldValue );
1823#else
1824        vps->setMaxVpsDecPicBufferingMinus1( i, k, j,  m_acTEncTop[vps->getLayerIdxInVps(layerId)].getMaxDecPicBuffering(j) - 1 );
1825#endif
1826        maxNumReorderPics       = std::max( maxNumReorderPics, m_acTEncTop[vps->getLayerIdxInVps(layerId)].getNumReorderPics(j));
1827      }
1828#if RESOLUTION_BASED_DPB
1829      for(Int k = 0; k < vps->getNumSubDpbs(i); k++)
1830      {
1831        // Decrement m_maxVpsDecPicBufferingMinus1
1832        Int oldValue = vps->getMaxVpsDecPicBufferingMinus1( i, vps->getSubDpbAssigned( layerSetIdxForOutputLayerSet, k ), j );
1833        vps->setMaxVpsDecPicBufferingMinus1( i, vps->getSubDpbAssigned( layerSetIdxForOutputLayerSet, k ), j, oldValue - 1 );
1834      }
1835#endif
1836      vps->setMaxVpsNumReorderPics(i, j, maxNumReorderPics);
1837      vps->determineSubDpbInfoFlags();
1838    }
1839  }
1840#endif
1841    vps->setMaxOneActiveRefLayerFlag(maxDirectRefLayers > 1 ? false : true);
1842#if O0062_POC_LSB_NOT_PRESENT_FLAG
1843    for(i = 1; i< vps->getMaxLayers(); i++)
1844    {
1845      if( vps->getNumDirectRefLayers( vps->getLayerIdInNuh(i) ) == 0  )
1846      {
1847#if Q0078_ADD_LAYER_SETS
1848        vps->setPocLsbNotPresentFlag(i, true); // make independedent layers base-layer compliant
1849#else
1850        vps->setPocLsbNotPresentFlag(i, false);
1851#endif
1852      }
1853    }
1854#endif
1855#if O0223_PICTURE_TYPES_ALIGN_FLAG
1856    vps->setCrossLayerPictureTypeAlignFlag( m_crossLayerPictureTypeAlignFlag );
1857#endif
1858#if P0068_CROSS_LAYER_ALIGNED_IDR_ONLY_FOR_IRAP_FLAG
1859    vps->setCrossLayerAlignedIdrOnlyFlag( m_crossLayerAlignedIdrOnlyFlag );
1860#endif
1861    vps->setCrossLayerIrapAlignFlag( m_crossLayerIrapAlignFlag );
1862    for(UInt layerCtr = 1;layerCtr <= vps->getMaxLayers() - 1; layerCtr++)
1863    {
1864      for(Int refLayerCtr = 0; refLayerCtr < layerCtr; refLayerCtr++)
1865      {
1866        if (vps->getDirectDependencyFlag( layerCtr, refLayerCtr))
1867        {
1868          if(m_acTEncTop[layerCtr].getIntraPeriod() !=  m_acTEncTop[refLayerCtr].getIntraPeriod())
1869          {
1870            vps->setCrossLayerIrapAlignFlag(false);
1871            break;
1872          }
1873        }
1874      }
1875    }
1876#if M0040_ADAPTIVE_RESOLUTION_CHANGE
1877  vps->setSingleLayerForNonIrapFlag(m_adaptiveResolutionChange > 0 ? true : false);
1878#endif
1879#if HIGHER_LAYER_IRAP_SKIP_FLAG
1880  vps->setHigherLayerIrapSkipFlag(m_skipPictureAtArcSwitch);
1881#endif
1882#if !P0125_REVERT_VPS_EXTN_OFFSET_TO_RESERVED
1883#if !VPS_EXTN_OFFSET_CALC
1884#if VPS_EXTN_OFFSET
1885  // to be updated according to the current semantics
1886  vps->setExtensionOffset( 0xffff );
1887#endif
1888#endif
1889#endif
1890
1891#if O0215_PHASE_ALIGNMENT
1892  vps->setPhaseAlignFlag( m_phaseAlignFlag );
1893#endif
1894
1895#if P0300_ALT_OUTPUT_LAYER_FLAG
1896  for (Int k = 0; k < MAX_VPS_LAYER_SETS_PLUS1; k++)
1897  {
1898    vps->setAltOuputLayerFlag( k, m_altOutputLayerFlag );
1899  }
1900#else
1901#if O0153_ALT_OUTPUT_LAYER_FLAG
1902  vps->setAltOuputLayerFlag( m_altOutputLayerFlag );
1903#endif
1904#endif
1905
1906#if P0312_VERT_PHASE_ADJ
1907  Bool vpsVuiVertPhaseInUseFlag = false;
1908  for( UInt layerId = 1; layerId < m_numLayers; layerId++ )
1909  {
1910    for( i = 0; i < m_acLayerCfg[layerId].m_numScaledRefLayerOffsets; i++ )
1911    {
1912      if( m_acTEncTop[layerId].getVertPhasePositionEnableFlag(i) )
1913      {
1914        vpsVuiVertPhaseInUseFlag = true;
1915        break;
1916      }
1917    }
1918  }
1919  vps->setVpsVuiVertPhaseInUseFlag( vpsVuiVertPhaseInUseFlag );
1920#endif
1921
1922#if VPS_VUI_BSP_HRD_PARAMS
1923  vps->setVpsVuiBspHrdPresentFlag(false);
1924  TEncTop *pcCfg = &m_acTEncTop[0];
1925  if( pcCfg->getBufferingPeriodSEIEnabled() )
1926  {
1927    Int j;
1928    vps->setVpsVuiBspHrdPresentFlag(true);
1929    vps->setVpsNumAddHrdParams( vps->getMaxLayers() );
1930    vps->createBspHrdParamBuffer(vps->getVpsNumAddHrdParams() + 1);
1931    for( i = vps->getNumHrdParameters(), j = 0; i < vps->getNumHrdParameters() + vps->getVpsNumAddHrdParams(); i++, j++ )
1932    {
1933      vps->setCprmsAddPresentFlag( j, true );
1934      vps->setNumSubLayerHrdMinus1( j, vps->getMaxTLayers() - 1 );
1935
1936      UInt layerIdx = j;
1937      TEncTop *pcCfgLayer = &m_acTEncTop[layerIdx];
1938
1939      Int iPicWidth         = pcCfgLayer->getSourceWidth();
1940      Int iPicHeight        = pcCfgLayer->getSourceHeight();
1941#if LAYER_CTB
1942      UInt uiWidthInCU       = ( iPicWidth  % m_acLayerCfg[layerIdx].m_uiMaxCUWidth  ) ? iPicWidth  / m_acLayerCfg[layerIdx].m_uiMaxCUWidth  + 1 : iPicWidth  / m_acLayerCfg[layerIdx].m_uiMaxCUWidth;
1943      UInt uiHeightInCU      = ( iPicHeight % m_acLayerCfg[layerIdx].m_uiMaxCUHeight ) ? iPicHeight / m_acLayerCfg[layerIdx].m_uiMaxCUHeight + 1 : iPicHeight / m_acLayerCfg[layerIdx].m_uiMaxCUHeight;
1944      UInt maxCU = pcCfgLayer->getSliceArgument() >> ( m_acLayerCfg[layerIdx].m_uiMaxCUDepth << 1);
1945#else
1946      UInt uiWidthInCU       = ( iPicWidth %m_uiMaxCUWidth  ) ? iPicWidth /m_uiMaxCUWidth  + 1 : iPicWidth /m_uiMaxCUWidth;
1947      UInt uiHeightInCU      = ( iPicHeight%m_uiMaxCUHeight ) ? iPicHeight/m_uiMaxCUHeight + 1 : iPicHeight/m_uiMaxCUHeight;
1948      UInt maxCU = pcCfgLayer->getSliceArgument() >> ( m_uiMaxCUDepth << 1);
1949#endif
1950      UInt uiNumCUsInFrame   = uiWidthInCU * uiHeightInCU;
1951
1952      UInt numDU = ( pcCfgLayer->getSliceMode() == 1 ) ? ( uiNumCUsInFrame / maxCU ) : ( 0 );
1953      if( uiNumCUsInFrame % maxCU != 0 || numDU == 0 )
1954      {
1955        numDU ++;
1956      }
1957      vps->getBspHrd(i)->setNumDU( numDU );
1958      vps->setBspHrdParameters( i, pcCfgLayer->getFrameRate(), numDU, pcCfgLayer->getTargetBitrate(), ( pcCfgLayer->getIntraPeriod() > 0 ) );
1959    }
1960
1961    // Signalling of additional partitioning schemes
1962    for(Int h = 1; h < vps->getNumOutputLayerSets(); h++)
1963    {
1964      Int lsIdx = vps->getOutputLayerSetIdx( h );
1965      vps->setNumSignalledPartitioningSchemes(h, 1);  // Only the default per-layer partitioning scheme
1966      for( j = 1; j < vps->getNumSignalledPartitioningSchemes(h); j++ )
1967      {
1968        // ToDo: Add code for additional partitioning schemes here
1969        // ToDo: Initialize num_partitions_in_scheme_minus1 and layer_included_in_partition_flag
1970      }
1971
1972      for( i = 0; i < vps->getNumSignalledPartitioningSchemes(h); i++ )
1973      {
1974        if( i == 0 )
1975        {
1976          for(Int t = 0; t <= vps->getMaxSLayersInLayerSetMinus1( lsIdx ); t++)
1977          {
1978            vps->setNumBspSchedulesMinus1( h, i, t, 0 );
1979            for( j = 0; j <= vps->getNumBspSchedulesMinus1(h, i, t); j++ )
1980            {
1981              for( Int k = 0; k <= vps->getNumPartitionsInSchemeMinus1(h, i); k++ )
1982              {
1983                // Only for the default partition
1984                Int nuhlayerId = vps->getLayerSetLayerIdList( lsIdx, k);
1985                Int layerIdxInVps = vps->getLayerIdxInVps( nuhlayerId );
1986                vps->setBspHrdIdx(h, i, t, j, k, layerIdxInVps + vps->getNumHrdParameters());
1987
1988                vps->setBspSchedIdx(h, i, t, j, k, 0);
1989              }
1990            }
1991          }
1992        }
1993        else
1994        {
1995          assert(0);    // Need to add support for additional partitioning schemes.
1996        }
1997      }
1998    }
1999  }
2000#else
2001
2002#if O0164_MULTI_LAYER_HRD
2003  vps->setVpsVuiBspHrdPresentFlag(false);
2004  TEncTop *pcCfg = &m_acTEncTop[0];
2005  if( pcCfg->getBufferingPeriodSEIEnabled() )
2006  {
2007    vps->setVpsVuiBspHrdPresentFlag(true);
2008#if Q0078_ADD_LAYER_SETS
2009    vps->setVpsNumBspHrdParametersMinus1(vps->getVpsNumLayerSetsMinus1() - 1); 
2010#else
2011    vps->setVpsNumBspHrdParametersMinus1(vps->getNumLayerSets() - 2); 
2012#endif
2013    vps->createBspHrdParamBuffer(vps->getVpsNumBspHrdParametersMinus1() + 1);
2014    for ( i = 0; i <= vps->getVpsNumBspHrdParametersMinus1(); i++ )
2015    {
2016      vps->setBspCprmsPresentFlag(i, true);
2017
2018      UInt layerId = i + 1;
2019      TEncTop *pcCfgLayer = &m_acTEncTop[layerId];
2020
2021      Int iPicWidth         = pcCfgLayer->getSourceWidth();
2022      Int iPicHeight        = pcCfgLayer->getSourceHeight();
2023#if LAYER_CTB
2024      UInt uiWidthInCU       = ( iPicWidth  % m_acLayerCfg[layerId].m_uiMaxCUWidth  ) ? iPicWidth  / m_acLayerCfg[layerId].m_uiMaxCUWidth  + 1 : iPicWidth  / m_acLayerCfg[layerId].m_uiMaxCUWidth;
2025      UInt uiHeightInCU      = ( iPicHeight % m_acLayerCfg[layerId].m_uiMaxCUHeight ) ? iPicHeight / m_acLayerCfg[layerId].m_uiMaxCUHeight + 1 : iPicHeight / m_acLayerCfg[layerId].m_uiMaxCUHeight;
2026#else
2027      UInt uiWidthInCU       = ( iPicWidth %m_uiMaxCUWidth  ) ? iPicWidth /m_uiMaxCUWidth  + 1 : iPicWidth /m_uiMaxCUWidth;
2028      UInt uiHeightInCU      = ( iPicHeight%m_uiMaxCUHeight ) ? iPicHeight/m_uiMaxCUHeight + 1 : iPicHeight/m_uiMaxCUHeight;
2029#endif
2030      UInt uiNumCUsInFrame   = uiWidthInCU * uiHeightInCU;
2031
2032#if LAYER_CTB
2033      UInt maxCU = pcCfgLayer->getSliceArgument() >> ( m_acLayerCfg[layerId].m_uiMaxCUDepth << 1);
2034#else
2035      UInt maxCU = pcCfgLayer->getSliceArgument() >> ( m_uiMaxCUDepth << 1);
2036#endif
2037      UInt numDU = ( pcCfgLayer->getSliceMode() == 1 ) ? ( uiNumCUsInFrame / maxCU ) : ( 0 );
2038      if( uiNumCUsInFrame % maxCU != 0 || numDU == 0 )
2039      {
2040        numDU ++;
2041      }
2042      vps->getBspHrd(i)->setNumDU( numDU );
2043      vps->setBspHrdParameters( i, pcCfgLayer->getFrameRate(), numDU, pcCfgLayer->getTargetBitrate(), ( pcCfgLayer->getIntraPeriod() > 0 ) );
2044    }
2045#if Q0078_ADD_LAYER_SETS
2046    for (UInt h = 1; h <= vps->getVpsNumLayerSetsMinus1(); h++)
2047#else
2048    for(UInt h = 1; h <= (vps->getNumLayerSets()-1); h++)
2049#endif
2050    {
2051      vps->setNumBitstreamPartitions(h, 1);
2052      for( i = 0; i < vps->getNumBitstreamPartitions(h); i++ )
2053      {
2054        for( UInt j = 0; j <= (vps->getMaxLayers()-1); j++ )
2055        {
2056          if (vps->getLayerIdIncludedFlag(h, j) && h == j)
2057          {
2058            vps->setLayerInBspFlag(h, i, j, true);
2059          }
2060        }
2061      }
2062      vps->setNumBspSchedCombinations(h, 1);
2063      for( i = 0; i < vps->getNumBspSchedCombinations(h); i++ )
2064      {
2065        for( UInt j = 0; j < vps->getNumBitstreamPartitions(h); j++ )
2066        {
2067          vps->setBspCombHrdIdx(h, i, j, 0);
2068          vps->setBspCombSchedIdx(h, i, j, 0);
2069        }
2070      }
2071    }
2072  }
2073#endif
2074#endif
2075
2076#else //SVC_EXTENSION
2077  m_cTEncTop.init(isFieldCoding);
2078#endif //SVC_EXTENSION
2079}
2080
2081// ====================================================================================================================
2082// Public member functions
2083// ====================================================================================================================
2084
2085/**
2086 - create internal class
2087 - initialize internal variable
2088 - until the end of input YUV file, call encoding function in TEncTop class
2089 - delete allocated buffers
2090 - destroy internal class
2091 .
2092 */
2093#if SVC_EXTENSION
2094Void TAppEncTop::encode()
2095{
2096  fstream bitstreamFile(m_pBitstreamFile, fstream::binary | fstream::out);
2097  if (!bitstreamFile)
2098  {
2099    fprintf(stderr, "\nfailed to open bitstream file `%s' for writing\n", m_pBitstreamFile);
2100    exit(EXIT_FAILURE);
2101  }
2102
2103  TComPicYuv*       pcPicYuvOrg [MAX_LAYERS];
2104  TComPicYuv*       pcPicYuvRec = NULL;
2105
2106  // initialize internal class & member variables
2107  xInitLibCfg();
2108  xCreateLib();
2109  xInitLib(m_isField);
2110
2111  // main encoder loop
2112  Int   iNumEncoded = 0, iTotalNumEncoded = 0;
2113  Bool  bEos = false;
2114
2115  const InputColourSpaceConversion ipCSC  =  m_inputColourSpaceConvert;
2116  const InputColourSpaceConversion snrCSC = (!m_snrInternalColourSpace) ? m_inputColourSpaceConvert : IPCOLOURSPACE_UNCHANGED;
2117
2118  list<AccessUnit> outputAccessUnits; ///< list of access units to write out.  is populated by the encoding process
2119
2120  TComPicYuv acPicYuvTrueOrg[MAX_LAYERS];
2121
2122  for(UInt layer=0; layer<m_numLayers; layer++)
2123  {
2124#if O0194_DIFFERENT_BITDEPTH_EL_BL
2125    //5
2126    g_bitDepth[CHANNEL_TYPE_LUMA]   = m_acLayerCfg[layer].m_internalBitDepth[CHANNEL_TYPE_LUMA];
2127    g_bitDepth[CHANNEL_TYPE_CHROMA] = m_acLayerCfg[layer].m_internalBitDepth[CHANNEL_TYPE_CHROMA];
2128
2129    g_PCMBitDepth[CHANNEL_TYPE_LUMA]   = m_bPCMInputBitDepthFlag ? m_acLayerCfg[layer].m_inputBitDepth[CHANNEL_TYPE_LUMA] : m_acLayerCfg[layer].m_internalBitDepth[CHANNEL_TYPE_LUMA];
2130    g_PCMBitDepth[CHANNEL_TYPE_CHROMA] = m_bPCMInputBitDepthFlag ? m_acLayerCfg[layer].m_inputBitDepth[CHANNEL_TYPE_CHROMA] : m_acLayerCfg[layer].m_internalBitDepth[CHANNEL_TYPE_CHROMA];
2131#endif
2132    // allocate original YUV buffer
2133    pcPicYuvOrg[layer] = new TComPicYuv;
2134    if( m_isField )
2135    {
2136#if LAYER_CTB
2137      pcPicYuvOrg[layer]->create( m_acLayerCfg[layer].getSourceWidth(), m_acLayerCfg[layer].getSourceHeightOrg(), m_acLayerCfg[layer].getChromaFormatIDC(), m_acLayerCfg[layer].m_uiMaxCUWidth, m_acLayerCfg[layer].m_uiMaxCUHeight, m_acLayerCfg[layer].m_uiMaxCUDepth, NULL );
2138      acPicYuvTrueOrg[layer].create( m_acLayerCfg[layer].getSourceWidth(), m_acLayerCfg[layer].getSourceHeightOrg(), m_acLayerCfg[layer].getChromaFormatIDC(), m_acLayerCfg[layer].m_uiMaxCUWidth, m_acLayerCfg[layer].m_uiMaxCUHeight, m_acLayerCfg[layer].m_uiMaxCUDepth, NULL );
2139#else
2140      pcPicYuvOrg[layer]->create( m_acLayerCfg[layer].getSourceWidth(), m_acLayerCfg[layer].getSourceHeightOrg(), m_acLayerCfg[layer].getChromaFormatIDC(), m_uiMaxCUWidth, m_uiMaxCUHeight, m_uiMaxCUDepth, NULL );
2141      acPicYuvTrueOrg[layer].create( m_acLayerCfg[layer].getSourceWidth(), m_acLayerCfg[layer].getSourceHeightOrg(), m_acLayerCfg[layer].getChromaFormatIDC(), m_uiMaxCUWidth, m_uiMaxCUHeight, m_uiMaxCUDepth, NULL );
2142#endif
2143    }
2144    else
2145    {
2146#if LAYER_CTB
2147      pcPicYuvOrg[layer]->create( m_acLayerCfg[layer].getSourceWidth(), m_acLayerCfg[layer].getSourceHeight(), m_acLayerCfg[layer].getChromaFormatIDC(), m_acLayerCfg[layer].m_uiMaxCUWidth, m_acLayerCfg[layer].m_uiMaxCUHeight, m_acLayerCfg[layer].m_uiMaxCUDepth, NULL );
2148      acPicYuvTrueOrg[layer].create( m_acLayerCfg[layer].getSourceWidth(), m_acLayerCfg[layer].getSourceHeight(), m_acLayerCfg[layer].getChromaFormatIDC(), m_acLayerCfg[layer].m_uiMaxCUWidth, m_acLayerCfg[layer].m_uiMaxCUHeight, m_acLayerCfg[layer].m_uiMaxCUDepth, NULL );
2149#else
2150      pcPicYuvOrg[layer]->create( m_acLayerCfg[layer].getSourceWidth(), m_acLayerCfg[layer].getSourceHeight(), m_acLayerCfg[layer].getChromaFormatIDC(), m_uiMaxCUWidth, m_uiMaxCUHeight, m_uiMaxCUDepth, NULL );
2151      acPicYuvTrueOrg[layer].create( m_acLayerCfg[layer].getSourceWidth(), m_acLayerCfg[layer].getSourceHeight(), m_acLayerCfg[layer].getChromaFormatIDC(), m_uiMaxCUWidth, m_uiMaxCUHeight, m_uiMaxCUDepth, NULL );
2152#endif
2153    }
2154  }
2155
2156  Bool bFirstFrame = true;
2157  while ( !bEos )
2158  {
2159    // Read enough frames
2160    Bool bFramesReadyToCode = false;
2161    while(!bFramesReadyToCode)
2162    {
2163      for(UInt layer=0; layer<m_numLayers; layer++)
2164      {
2165#if O0194_DIFFERENT_BITDEPTH_EL_BL
2166        //6
2167        for (UInt channelTypeIndex = 0; channelTypeIndex < MAX_NUM_CHANNEL_TYPE; channelTypeIndex++)
2168        {
2169          g_bitDepth[channelTypeIndex]    = m_acLayerCfg[layer].m_internalBitDepth[channelTypeIndex];
2170          g_PCMBitDepth[channelTypeIndex] = m_bPCMInputBitDepthFlag ? m_acLayerCfg[layer].m_inputBitDepth[channelTypeIndex] : m_acLayerCfg[layer].m_internalBitDepth[channelTypeIndex];
2171        }
2172#endif
2173#if LAYER_CTB
2174        g_uiMaxCUWidth  = g_auiLayerMaxCUWidth[layer];
2175        g_uiMaxCUHeight = g_auiLayerMaxCUHeight[layer];
2176        g_uiMaxCUDepth  = g_auiLayerMaxCUDepth[layer];
2177        g_uiAddCUDepth  = g_auiLayerAddCUDepth[layer];
2178#endif
2179
2180        // get buffers
2181        xGetBuffer(pcPicYuvRec, layer);
2182
2183        // read input YUV file
2184        m_acTVideoIOYuvInputFile[layer].read( pcPicYuvOrg[layer], &acPicYuvTrueOrg[layer], ipCSC, m_acLayerCfg[layer].getPad(), m_acLayerCfg[layer].getInputChromaFormat() );
2185
2186#if AUXILIARY_PICTURES
2187#if R0062_AUX_PSEUDO_MONOCHROME
2188        if ( m_acLayerCfg[layer].getChromaFormatIDC() == CHROMA_400 ||
2189             (m_apcTEncTop[0]->getVPS()->getScalabilityMask(AUX_ID) && (m_acLayerCfg[layer].getAuxId() == AUX_ALPHA || m_acLayerCfg[layer].getAuxId() == AUX_DEPTH)) )
2190#else
2191        if (m_acLayerCfg[layer].getChromaFormatIDC() == CHROMA_400)
2192#endif
2193        {
2194          pcPicYuvOrg[layer]->convertToMonochrome();
2195        }
2196#endif
2197
2198        if(layer == m_numLayers-1)
2199        {
2200          // increase number of received frames
2201          m_iFrameRcvd++;
2202          // check end of file
2203          bEos = (m_isField && (m_iFrameRcvd == (m_framesToBeEncoded >> 1) )) || ( !m_isField && (m_iFrameRcvd == m_framesToBeEncoded) );
2204        }
2205
2206        if ( m_isField )
2207        {
2208          m_acTEncTop[layer].encodePrep( pcPicYuvOrg[layer], &acPicYuvTrueOrg[layer], m_isTopFieldFirst );
2209        }
2210        else
2211        {
2212          m_acTEncTop[layer].encodePrep( pcPicYuvOrg[layer], &acPicYuvTrueOrg[layer] );
2213        }
2214      }
2215
2216      bFramesReadyToCode = !(!bFirstFrame && ( m_acTEncTop[m_numLayers-1].getNumPicRcvd() != m_iGOPSize && m_iGOPSize ) && !bEos );
2217    }
2218    Bool flush = 0;
2219    // if end of file (which is only detected on a read failure) flush the encoder of any queued pictures
2220    if (m_acTVideoIOYuvInputFile[m_numLayers-1].isEof())
2221    {
2222      flush = true;
2223      bEos = true;
2224      m_iFrameRcvd--;
2225      m_acTEncTop[m_numLayers-1].setFramesToBeEncoded(m_iFrameRcvd);
2226    }
2227
2228#if RC_SHVC_HARMONIZATION
2229    for(UInt layer=0; layer<m_numLayers; layer++)
2230    {
2231      if ( m_acTEncTop[layer].getUseRateCtrl() )
2232      {
2233        (m_acTEncTop[layer].getRateCtrl())->initRCGOP(m_acTEncTop[layer].getNumPicRcvd());
2234      }
2235    }
2236#endif
2237
2238#if M0040_ADAPTIVE_RESOLUTION_CHANGE
2239    if (m_adaptiveResolutionChange)
2240    {
2241      for(UInt layer = 0; layer < m_numLayers; layer++)
2242      {
2243        TComList<TComPicYuv*>::iterator iterPicYuvRec;
2244        for (iterPicYuvRec = m_acListPicYuvRec[layer].begin(); iterPicYuvRec != m_acListPicYuvRec[layer].end(); iterPicYuvRec++)
2245        {
2246          TComPicYuv* recPic = *(iterPicYuvRec);
2247          recPic->setReconstructed(false);
2248        }
2249      }
2250    }
2251#endif
2252
2253    // loop through frames in one GOP
2254    for ( UInt iPicIdInGOP=0; iPicIdInGOP < (bFirstFrame? 1:m_iGOPSize); iPicIdInGOP++ )
2255    {
2256      // layer by layer for each frame
2257      for(UInt layer=0; layer<m_numLayers; layer++)
2258      {
2259#if O0194_DIFFERENT_BITDEPTH_EL_BL
2260        //7
2261        for (UInt channelTypeIndex = 0; channelTypeIndex < MAX_NUM_CHANNEL_TYPE; channelTypeIndex++)
2262        {
2263          g_bitDepth[channelTypeIndex]    = m_acLayerCfg[layer].m_internalBitDepth[channelTypeIndex];
2264          g_PCMBitDepth[channelTypeIndex] = m_bPCMInputBitDepthFlag ? m_acLayerCfg[layer].m_inputBitDepth[channelTypeIndex] : m_acLayerCfg[layer].m_internalBitDepth[channelTypeIndex];
2265        }
2266#endif
2267#if LAYER_CTB
2268        g_uiMaxCUWidth  = g_auiLayerMaxCUWidth[layer];
2269        g_uiMaxCUHeight = g_auiLayerMaxCUHeight[layer];
2270        g_uiMaxCUDepth  = g_auiLayerMaxCUDepth[layer];
2271        g_uiAddCUDepth  = g_auiLayerAddCUDepth[layer];
2272
2273        memcpy( g_auiZscanToRaster, g_auiLayerZscanToRaster[layer], sizeof( g_auiZscanToRaster ) );
2274        memcpy( g_auiRasterToZscan, g_auiLayerRasterToZscan[layer], sizeof( g_auiRasterToZscan ) );
2275        memcpy( g_auiRasterToPelX,  g_auiLayerRasterToPelX[layer],  sizeof( g_auiRasterToPelX ) );
2276        memcpy( g_auiRasterToPelY,  g_auiLayerRasterToPelY[layer],  sizeof( g_auiRasterToPelY ) );
2277#endif
2278        // call encoding function for one frame
2279        if ( m_isField ) m_acTEncTop[layer].encode( flush ? 0 : pcPicYuvOrg[layer], snrCSC, m_acListPicYuvRec[layer], outputAccessUnits, iPicIdInGOP, m_isTopFieldFirst );
2280        else             m_acTEncTop[layer].encode( flush ? 0 : pcPicYuvOrg[layer], snrCSC, m_acListPicYuvRec[layer], outputAccessUnits, iPicIdInGOP );
2281      }
2282    }
2283#if R0247_SEI_ACTIVE
2284    if(bFirstFrame)
2285    {
2286      list<AccessUnit>::iterator first_au = outputAccessUnits.begin();
2287      if( m_nonHEVCBaseLayerFlag )
2288      {
2289        first_au++;
2290      }
2291      AccessUnit::iterator it_sps;
2292      for (it_sps = first_au->begin(); it_sps != first_au->end(); it_sps++)
2293      {
2294        if( (*it_sps)->m_nalUnitType == NAL_UNIT_SPS )
2295        {
2296          break;
2297        }
2298      }
2299
2300      for (list<AccessUnit>::iterator it_au = ++outputAccessUnits.begin(); it_au != outputAccessUnits.end(); it_au++)
2301      {
2302        for (AccessUnit::iterator it_nalu = it_au->begin(); it_nalu != it_au->end(); it_nalu++)
2303        {
2304          if( (*it_nalu)->m_nalUnitType == NAL_UNIT_SPS )
2305          {
2306            first_au->insert(++it_sps, *it_nalu);
2307            it_nalu = it_au->erase(it_nalu);
2308          }
2309        }
2310      }
2311    }
2312
2313#endif
2314
2315#if RC_SHVC_HARMONIZATION
2316    for(UInt layer=0; layer<m_numLayers; layer++)
2317    {
2318      if ( m_acTEncTop[layer].getUseRateCtrl() )
2319      {
2320        (m_acTEncTop[layer].getRateCtrl())->destroyRCGOP();
2321      }
2322    }
2323#endif
2324
2325    iTotalNumEncoded = 0;
2326    for(UInt layer=0; layer<m_numLayers; layer++)
2327    {
2328#if O0194_DIFFERENT_BITDEPTH_EL_BL
2329      //8
2330      for (UInt channelTypeIndex = 0; channelTypeIndex < MAX_NUM_CHANNEL_TYPE; channelTypeIndex++)
2331      {
2332        g_bitDepth[channelTypeIndex]    = m_acLayerCfg[layer].m_internalBitDepth[channelTypeIndex];
2333        g_PCMBitDepth[channelTypeIndex] = m_bPCMInputBitDepthFlag ? m_acLayerCfg[layer].m_inputBitDepth[channelTypeIndex] : m_acLayerCfg[layer].m_internalBitDepth[channelTypeIndex];
2334      }
2335#endif
2336      // write bistream to file if necessary
2337      iNumEncoded = m_acTEncTop[layer].getNumPicRcvd();
2338      if ( iNumEncoded > 0 )
2339      {
2340        xWriteRecon(layer, iNumEncoded);
2341        iTotalNumEncoded += iNumEncoded;
2342      }
2343      m_acTEncTop[layer].setNumPicRcvd( 0 );
2344    }
2345
2346    // write bitstream out
2347    if(iTotalNumEncoded)
2348    {
2349#if P0130_EOB
2350      if( bEos )
2351      {
2352        OutputNALUnit nalu(NAL_UNIT_EOB);
2353        nalu.m_layerId = 0;
2354
2355        AccessUnit& accessUnit = outputAccessUnits.back();
2356#if T_ID_EOB_BUG_FIX
2357        nalu.m_temporalId = 0;
2358#else
2359        nalu.m_temporalId = accessUnit.front()->m_temporalId;
2360#endif
2361        accessUnit.push_back(new NALUnitEBSP(nalu));
2362      }
2363#endif
2364      xWriteStream(bitstreamFile, iTotalNumEncoded, outputAccessUnits);
2365      outputAccessUnits.clear();
2366    }
2367
2368    // print out summary
2369    if (bEos)
2370    {
2371      printOutSummary(m_isTopFieldFirst, m_printMSEBasedSequencePSNR, m_printSequenceMSE);
2372    }
2373
2374    bFirstFrame = false;
2375  }
2376  // delete original YUV buffer
2377  for(UInt layer=0; layer<m_numLayers; layer++)
2378  {
2379    pcPicYuvOrg[layer]->destroy();
2380    delete pcPicYuvOrg[layer];
2381    pcPicYuvOrg[layer] = NULL;
2382
2383    // delete used buffers in encoder class
2384    m_acTEncTop[layer].deletePicBuffer();
2385    acPicYuvTrueOrg[layer].destroy();
2386  }
2387
2388  // delete buffers & classes
2389  xDeleteBuffer();
2390  xDestroyLib();
2391
2392  printRateSummary();
2393
2394  return;
2395}
2396
2397Void TAppEncTop::printOutSummary(Bool isField, const Bool printMSEBasedSNR, const Bool printSequenceMSE)
2398{
2399  UInt layer;
2400
2401  // set frame rate
2402  for(layer = 0; layer < m_numLayers; layer++)
2403  {
2404    if(isField)
2405    {
2406      m_gcAnalyzeAll[layer].setFrmRate( m_acLayerCfg[layer].getFrameRate() * 2);
2407      m_gcAnalyzeI[layer].setFrmRate( m_acLayerCfg[layer].getFrameRate() * 2 );
2408      m_gcAnalyzeP[layer].setFrmRate( m_acLayerCfg[layer].getFrameRate() * 2 );
2409      m_gcAnalyzeB[layer].setFrmRate( m_acLayerCfg[layer].getFrameRate() * 2 );
2410    }
2411    else
2412    {
2413      m_gcAnalyzeAll[layer].setFrmRate( m_acLayerCfg[layer].getFrameRate());
2414      m_gcAnalyzeI[layer].setFrmRate( m_acLayerCfg[layer].getFrameRate() );
2415      m_gcAnalyzeP[layer].setFrmRate( m_acLayerCfg[layer].getFrameRate() );
2416      m_gcAnalyzeB[layer].setFrmRate( m_acLayerCfg[layer].getFrameRate() );
2417    }
2418  }
2419
2420  //-- all
2421  printf( "\n\nSUMMARY --------------------------------------------------------\n" );
2422  for(layer = 0; layer < m_numLayers; layer++)
2423  {
2424    m_gcAnalyzeAll[layer].printOut('a', m_acLayerCfg[layer].getChromaFormatIDC(), printMSEBasedSNR, printSequenceMSE, layer);
2425  }
2426
2427  printf( "\n\nI Slices--------------------------------------------------------\n" );
2428  for(layer = 0; layer < m_numLayers; layer++)
2429  {
2430    m_gcAnalyzeI[layer].printOut('i', m_acLayerCfg[layer].getChromaFormatIDC(), printMSEBasedSNR, printSequenceMSE, layer);
2431  }
2432
2433  printf( "\n\nP Slices--------------------------------------------------------\n" );
2434  for(layer = 0; layer < m_numLayers; layer++)
2435  {
2436    m_gcAnalyzeP[layer].printOut('p', m_acLayerCfg[layer].getChromaFormatIDC(), printMSEBasedSNR, printSequenceMSE, layer);
2437  }
2438
2439  printf( "\n\nB Slices--------------------------------------------------------\n" );
2440  for(layer = 0; layer < m_numLayers; layer++)
2441  {
2442    m_gcAnalyzeB[layer].printOut('b', m_acLayerCfg[layer].getChromaFormatIDC(), printMSEBasedSNR, printSequenceMSE, layer);
2443  }
2444
2445  if(isField)
2446  {
2447    for(layer = 0; layer < m_numLayers; layer++)
2448    {
2449      //-- interlaced summary
2450      m_gcAnalyzeAll_in.setFrmRate( m_acLayerCfg[layer].getFrameRate());
2451      m_gcAnalyzeAll_in.setBits(m_gcAnalyzeB[layer].getBits());
2452      // prior to the above statement, the interlace analyser does not contain the correct total number of bits.
2453
2454      printf( "\n\nSUMMARY INTERLACED ---------------------------------------------\n" );
2455      m_gcAnalyzeAll_in.printOut('a', m_acLayerCfg[layer].getChromaFormatIDC(), printMSEBasedSNR, printSequenceMSE, layer);
2456
2457#if _SUMMARY_OUT_
2458      m_gcAnalyzeAll_in.printSummaryOutInterlaced();
2459#endif
2460    }
2461  }
2462
2463  printf("\n");
2464  //printf("\nRVM: %.3lf\n" , xCalculateRVM());
2465}
2466
2467#else
2468// ====================================================================================================================
2469// Public member functions
2470// ====================================================================================================================
2471
2472/**
2473 - create internal class
2474 - initialize internal variable
2475 - until the end of input YUV file, call encoding function in TEncTop class
2476 - delete allocated buffers
2477 - destroy internal class
2478 .
2479 */
2480Void TAppEncTop::encode()
2481{
2482  fstream bitstreamFile(m_pchBitstreamFile, fstream::binary | fstream::out);
2483  if (!bitstreamFile)
2484  {
2485    fprintf(stderr, "\nfailed to open bitstream file `%s' for writing\n", m_pchBitstreamFile);
2486    exit(EXIT_FAILURE);
2487  }
2488
2489  TComPicYuv*       pcPicYuvOrg = new TComPicYuv;
2490  TComPicYuv*       pcPicYuvRec = NULL;
2491
2492  // initialize internal class & member variables
2493  xInitLibCfg();
2494  xCreateLib();
2495  xInitLib(m_isField);
2496
2497  printChromaFormat();
2498
2499  // main encoder loop
2500  Int   iNumEncoded = 0;
2501  Bool  bEos = false;
2502
2503  const InputColourSpaceConversion ipCSC  =  m_inputColourSpaceConvert;
2504  const InputColourSpaceConversion snrCSC = (!m_snrInternalColourSpace) ? m_inputColourSpaceConvert : IPCOLOURSPACE_UNCHANGED;
2505
2506  list<AccessUnit> outputAccessUnits; ///< list of access units to write out.  is populated by the encoding process
2507
2508  TComPicYuv cPicYuvTrueOrg;
2509
2510  // allocate original YUV buffer
2511  if( m_isField )
2512  {
2513    pcPicYuvOrg->create( m_iSourceWidth, m_iSourceHeightOrg, m_chromaFormatIDC, m_uiMaxCUWidth, m_uiMaxCUHeight, m_uiMaxCUDepth );
2514  cPicYuvTrueOrg.create(m_iSourceWidth, m_iSourceHeightOrg, m_chromaFormatIDC, m_uiMaxCUWidth, m_uiMaxCUHeight, m_uiMaxCUDepth);
2515  }
2516  else
2517  {
2518    pcPicYuvOrg->create( m_iSourceWidth, m_iSourceHeight, m_chromaFormatIDC, m_uiMaxCUWidth, m_uiMaxCUHeight, m_uiMaxCUDepth );
2519  cPicYuvTrueOrg.create(m_iSourceWidth, m_iSourceHeight, m_chromaFormatIDC, m_uiMaxCUWidth, m_uiMaxCUHeight, m_uiMaxCUDepth);
2520  }
2521
2522  while ( !bEos )
2523  {
2524    // get buffers
2525    xGetBuffer(pcPicYuvRec);
2526
2527    // read input YUV file
2528    m_cTVideoIOYuvInputFile.read( pcPicYuvOrg, &cPicYuvTrueOrg, ipCSC, m_aiPad, m_InputChromaFormatIDC );
2529
2530    // increase number of received frames
2531    m_iFrameRcvd++;
2532
2533    bEos = (m_isField && (m_iFrameRcvd == (m_framesToBeEncoded >> 1) )) || ( !m_isField && (m_iFrameRcvd == m_framesToBeEncoded) );
2534
2535    Bool flush = 0;
2536    // if end of file (which is only detected on a read failure) flush the encoder of any queued pictures
2537    if (m_cTVideoIOYuvInputFile.isEof())
2538    {
2539      flush = true;
2540      bEos = true;
2541      m_iFrameRcvd--;
2542      m_cTEncTop.setFramesToBeEncoded(m_iFrameRcvd);
2543    }
2544
2545    // call encoding function for one frame
2546    if ( m_isField ) m_cTEncTop.encode( bEos, flush ? 0 : pcPicYuvOrg, flush ? 0 : &cPicYuvTrueOrg, snrCSC, m_cListPicYuvRec, outputAccessUnits, iNumEncoded, m_isTopFieldFirst );
2547    else             m_cTEncTop.encode( bEos, flush ? 0 : pcPicYuvOrg, flush ? 0 : &cPicYuvTrueOrg, snrCSC, m_cListPicYuvRec, outputAccessUnits, iNumEncoded );
2548
2549    // write bistream to file if necessary
2550    if ( iNumEncoded > 0 )
2551    {
2552      xWriteOutput(bitstreamFile, iNumEncoded, outputAccessUnits);
2553      outputAccessUnits.clear();
2554    }
2555  }
2556
2557  m_cTEncTop.printSummary(m_isField);
2558
2559  // delete original YUV buffer
2560  pcPicYuvOrg->destroy();
2561  delete pcPicYuvOrg;
2562  pcPicYuvOrg = NULL;
2563
2564  // delete used buffers in encoder class
2565  m_cTEncTop.deletePicBuffer();
2566  cPicYuvTrueOrg.destroy();
2567
2568  // delete buffers & classes
2569  xDeleteBuffer();
2570  xDestroyLib();
2571
2572  printRateSummary();
2573
2574  return;
2575}
2576#endif
2577
2578// ====================================================================================================================
2579// Protected member functions
2580// ====================================================================================================================
2581
2582/**
2583 - application has picture buffer list with size of GOP
2584 - picture buffer list acts as ring buffer
2585 - end of the list has the latest picture
2586 .
2587 */
2588#if SVC_EXTENSION
2589Void TAppEncTop::xGetBuffer( TComPicYuv*& rpcPicYuvRec, UInt layer)
2590{
2591  assert( m_iGOPSize > 0 );
2592
2593  // org. buffer
2594  if ( m_acListPicYuvRec[layer].size() >= (UInt)m_iGOPSize ) // buffer will be 1 element longer when using field coding, to maintain first field whilst processing second.
2595  {
2596    rpcPicYuvRec = m_acListPicYuvRec[layer].popFront();
2597
2598  }
2599  else
2600  {
2601    rpcPicYuvRec = new TComPicYuv;
2602
2603#if LAYER_CTB
2604    rpcPicYuvRec->create( m_acLayerCfg[layer].getSourceWidth(), m_acLayerCfg[layer].getSourceHeight(), m_acLayerCfg[layer].getChromaFormatIDC(), m_acLayerCfg[layer].m_uiMaxCUWidth, m_acLayerCfg[layer].m_uiMaxCUHeight, m_acLayerCfg[layer].m_uiMaxCUDepth, NULL );
2605#else
2606    rpcPicYuvRec->create( m_acLayerCfg[layer].getSourceWidth(), m_acLayerCfg[layer].getSourceHeight(), m_acLayerCfg[layer].getChromaFormatIDC(), m_uiMaxCUWidth, m_uiMaxCUHeight, m_uiMaxCUDepth, NULL );
2607#endif
2608
2609  }
2610  m_acListPicYuvRec[layer].pushBack( rpcPicYuvRec );
2611}
2612
2613Void TAppEncTop::xDeleteBuffer( )
2614{
2615  for(UInt layer=0; layer<m_numLayers; layer++)
2616  {
2617    TComList<TComPicYuv*>::iterator iterPicYuvRec  = m_acListPicYuvRec[layer].begin();
2618
2619    Int iSize = Int( m_acListPicYuvRec[layer].size() );
2620
2621    for ( Int i = 0; i < iSize; i++ )
2622    {
2623      TComPicYuv*  pcPicYuvRec  = *(iterPicYuvRec++);
2624      pcPicYuvRec->destroy();
2625      delete pcPicYuvRec; pcPicYuvRec = NULL;
2626    }
2627  }
2628}
2629
2630Void TAppEncTop::xWriteRecon(UInt layer, Int iNumEncoded)
2631{
2632#if REPN_FORMAT_IN_VPS
2633  ChromaFormat chromaFormatIdc = m_acLayerCfg[layer].getChromaFormatIDC();
2634  Int xScal = TComSPS::getWinUnitX( chromaFormatIdc );
2635  Int yScal = TComSPS::getWinUnitY( chromaFormatIdc );
2636#endif
2637
2638  const InputColourSpaceConversion ipCSC = (!m_outputInternalColourSpace) ? m_inputColourSpaceConvert : IPCOLOURSPACE_UNCHANGED;
2639
2640  if (m_isField)
2641  {
2642    //Reinterlace fields
2643    Int i;
2644    TComList<TComPicYuv*>::iterator iterPicYuvRec = m_acListPicYuvRec[layer].end();
2645
2646    for ( i = 0; i < iNumEncoded; i++ )
2647    {
2648      --iterPicYuvRec;
2649    }
2650
2651    for ( i = 0; i < iNumEncoded/2; i++ )
2652    {
2653      TComPicYuv*  pcPicYuvRecTop  = *(iterPicYuvRec++);
2654      TComPicYuv*  pcPicYuvRecBottom  = *(iterPicYuvRec++);
2655
2656#if M0040_ADAPTIVE_RESOLUTION_CHANGE
2657      if (!m_acLayerCfg[layer].getReconFile().empty() && pcPicYuvRecTop->isReconstructed() && pcPicYuvRecBottom->isReconstructed())
2658#else
2659      if (!m_acLayerCfg[layer].getReconFile().empty())
2660#endif
2661      {
2662#if REPN_FORMAT_IN_VPS
2663        m_acTVideoIOYuvReconFile[layer].write( pcPicYuvRecTop, pcPicYuvRecBottom, ipCSC, m_acLayerCfg[layer].getConfWinLeft() * xScal, m_acLayerCfg[layer].getConfWinRight() * xScal, 
2664          m_acLayerCfg[layer].getConfWinTop() * yScal, m_acLayerCfg[layer].getConfWinBottom() * yScal, NUM_CHROMA_FORMAT, m_isTopFieldFirst );
2665#else
2666        m_acTVideoIOYuvReconFile[layer].write( pcPicYuvRecTop, pcPicYuvRecBottom, ipCSC, m_acLayerCfg[layer].getConfWinLeft(), m_acLayerCfg[layer].getConfWinRight(), m_acLayerCfg[layer].getConfWinTop(), m_acLayerCfg[layer].getConfWinBottom(), NUM_CHROMA_FORMAT, m_isTopFieldFirst );
2667#endif
2668      }
2669    }
2670  }
2671  else
2672  {
2673    Int i;
2674
2675    TComList<TComPicYuv*>::iterator iterPicYuvRec = m_acListPicYuvRec[layer].end();
2676
2677    for ( i = 0; i < iNumEncoded; i++ )
2678    {
2679      --iterPicYuvRec;
2680    }
2681
2682    for ( i = 0; i < iNumEncoded; i++ )
2683    {
2684      TComPicYuv*  pcPicYuvRec  = *(iterPicYuvRec++);
2685#if M0040_ADAPTIVE_RESOLUTION_CHANGE
2686      if (!m_acLayerCfg[layer].getReconFile().empty() && pcPicYuvRec->isReconstructed())
2687#else
2688      if (!m_acLayerCfg[layer].getReconFile().empty())
2689#endif
2690      {
2691#if REPN_FORMAT_IN_VPS
2692        m_acTVideoIOYuvReconFile[layer].write( pcPicYuvRec, ipCSC, m_acLayerCfg[layer].getConfWinLeft() * xScal, m_acLayerCfg[layer].getConfWinRight() * xScal,
2693          m_acLayerCfg[layer].getConfWinTop() * yScal, m_acLayerCfg[layer].getConfWinBottom() * yScal );
2694#else
2695        m_acTVideoIOYuvReconFile[layer].write( pcPicYuvRec, ipCSC, m_acLayerCfg[layer].getConfWinLeft(), m_acLayerCfg[layer].getConfWinRight(),
2696          m_acLayerCfg[layer].getConfWinTop(), m_acLayerCfg[layer].getConfWinBottom() );
2697#endif
2698      }
2699    }
2700  }
2701}
2702
2703Void TAppEncTop::xWriteStream(std::ostream& bitstreamFile, Int iNumEncoded, const std::list<AccessUnit>& accessUnits)
2704{
2705  if (m_isField)
2706  {
2707    //Reinterlace fields
2708    Int i;
2709    list<AccessUnit>::const_iterator iterBitstream = accessUnits.begin();
2710
2711#if M0040_ADAPTIVE_RESOLUTION_CHANGE
2712    for ( i = 0; i < iNumEncoded/2 && iterBitstream != accessUnits.end(); i++ )
2713#else
2714    for ( i = 0; i < iNumEncoded/2; i++ )
2715#endif
2716    {
2717      const AccessUnit& auTop = *(iterBitstream++);
2718      const vector<UInt>& statsTop = writeAnnexB(bitstreamFile, auTop);
2719      rateStatsAccum(auTop, statsTop);
2720
2721      const AccessUnit& auBottom = *(iterBitstream++);
2722      const vector<UInt>& statsBottom = writeAnnexB(bitstreamFile, auBottom);
2723      rateStatsAccum(auBottom, statsBottom);
2724    }
2725  }
2726  else
2727  {
2728    Int i;
2729
2730    list<AccessUnit>::const_iterator iterBitstream = accessUnits.begin();
2731
2732#if M0040_ADAPTIVE_RESOLUTION_CHANGE
2733    for ( i = 0; i < iNumEncoded && iterBitstream != accessUnits.end(); i++ )
2734#else
2735    for ( i = 0; i < iNumEncoded; i++ )
2736#endif
2737    {
2738      const AccessUnit& au = *(iterBitstream++);
2739      const vector<UInt>& stats = writeAnnexB(bitstreamFile, au);
2740      rateStatsAccum(au, stats);
2741    }
2742  }
2743}
2744
2745#else // SVC_EXTENSION
2746Void TAppEncTop::xGetBuffer( TComPicYuv*& rpcPicYuvRec)
2747{
2748  assert( m_iGOPSize > 0 );
2749
2750  // org. buffer
2751  if ( m_cListPicYuvRec.size() >= (UInt)m_iGOPSize ) // buffer will be 1 element longer when using field coding, to maintain first field whilst processing second.
2752  {
2753    rpcPicYuvRec = m_cListPicYuvRec.popFront();
2754
2755  }
2756  else
2757  {
2758    rpcPicYuvRec = new TComPicYuv;
2759
2760    rpcPicYuvRec->create( m_iSourceWidth, m_iSourceHeight, m_chromaFormatIDC, m_uiMaxCUWidth, m_uiMaxCUHeight, m_uiMaxCUDepth );
2761
2762  }
2763  m_cListPicYuvRec.pushBack( rpcPicYuvRec );
2764}
2765
2766Void TAppEncTop::xDeleteBuffer( )
2767{
2768  TComList<TComPicYuv*>::iterator iterPicYuvRec  = m_cListPicYuvRec.begin();
2769
2770  Int iSize = Int( m_cListPicYuvRec.size() );
2771
2772  for ( Int i = 0; i < iSize; i++ )
2773  {
2774    TComPicYuv*  pcPicYuvRec  = *(iterPicYuvRec++);
2775    pcPicYuvRec->destroy();
2776    delete pcPicYuvRec; pcPicYuvRec = NULL;
2777  }
2778
2779}
2780
2781/** \param iNumEncoded  number of encoded frames
2782 */
2783Void TAppEncTop::xWriteOutput(std::ostream& bitstreamFile, Int iNumEncoded, const std::list<AccessUnit>& accessUnits)
2784{
2785  const InputColourSpaceConversion ipCSC = (!m_outputInternalColourSpace) ? m_inputColourSpaceConvert : IPCOLOURSPACE_UNCHANGED;
2786
2787  if (m_isField)
2788  {
2789    //Reinterlace fields
2790    Int i;
2791    TComList<TComPicYuv*>::iterator iterPicYuvRec = m_cListPicYuvRec.end();
2792    list<AccessUnit>::const_iterator iterBitstream = accessUnits.begin();
2793
2794    for ( i = 0; i < iNumEncoded; i++ )
2795    {
2796      --iterPicYuvRec;
2797    }
2798
2799    for ( i = 0; i < iNumEncoded/2; i++ )
2800    {
2801      TComPicYuv*  pcPicYuvRecTop  = *(iterPicYuvRec++);
2802      TComPicYuv*  pcPicYuvRecBottom  = *(iterPicYuvRec++);
2803
2804      if (m_pchReconFile)
2805      {
2806        m_cTVideoIOYuvReconFile.write( pcPicYuvRecTop, pcPicYuvRecBottom, ipCSC, m_confWinLeft, m_confWinRight, m_confWinTop, m_confWinBottom, NUM_CHROMA_FORMAT, m_isTopFieldFirst );
2807      }
2808
2809      const AccessUnit& auTop = *(iterBitstream++);
2810      const vector<UInt>& statsTop = writeAnnexB(bitstreamFile, auTop);
2811      rateStatsAccum(auTop, statsTop);
2812
2813      const AccessUnit& auBottom = *(iterBitstream++);
2814      const vector<UInt>& statsBottom = writeAnnexB(bitstreamFile, auBottom);
2815      rateStatsAccum(auBottom, statsBottom);
2816    }
2817  }
2818  else
2819  {
2820    Int i;
2821
2822    TComList<TComPicYuv*>::iterator iterPicYuvRec = m_cListPicYuvRec.end();
2823    list<AccessUnit>::const_iterator iterBitstream = accessUnits.begin();
2824
2825    for ( i = 0; i < iNumEncoded; i++ )
2826    {
2827      --iterPicYuvRec;
2828    }
2829
2830    for ( i = 0; i < iNumEncoded; i++ )
2831    {
2832      TComPicYuv*  pcPicYuvRec  = *(iterPicYuvRec++);
2833      if (m_pchReconFile)
2834      {
2835        m_cTVideoIOYuvReconFile.write( pcPicYuvRec, ipCSC, m_confWinLeft, m_confWinRight, m_confWinTop, m_confWinBottom );
2836      }
2837
2838      const AccessUnit& au = *(iterBitstream++);
2839      const vector<UInt>& stats = writeAnnexB(bitstreamFile, au);
2840      rateStatsAccum(au, stats);
2841    }
2842  }
2843}
2844#endif
2845
2846/**
2847 *
2848 */
2849Void TAppEncTop::rateStatsAccum(const AccessUnit& au, const std::vector<UInt>& annexBsizes)
2850{
2851  AccessUnit::const_iterator it_au = au.begin();
2852  vector<UInt>::const_iterator it_stats = annexBsizes.begin();
2853
2854  for (; it_au != au.end(); it_au++, it_stats++)
2855  {
2856    switch ((*it_au)->m_nalUnitType)
2857    {
2858    case NAL_UNIT_CODED_SLICE_TRAIL_R:
2859    case NAL_UNIT_CODED_SLICE_TRAIL_N:
2860    case NAL_UNIT_CODED_SLICE_TSA_R:
2861    case NAL_UNIT_CODED_SLICE_TSA_N:
2862    case NAL_UNIT_CODED_SLICE_STSA_R:
2863    case NAL_UNIT_CODED_SLICE_STSA_N:
2864    case NAL_UNIT_CODED_SLICE_BLA_W_LP:
2865    case NAL_UNIT_CODED_SLICE_BLA_W_RADL:
2866    case NAL_UNIT_CODED_SLICE_BLA_N_LP:
2867    case NAL_UNIT_CODED_SLICE_IDR_W_RADL:
2868    case NAL_UNIT_CODED_SLICE_IDR_N_LP:
2869    case NAL_UNIT_CODED_SLICE_CRA:
2870    case NAL_UNIT_CODED_SLICE_RADL_N:
2871    case NAL_UNIT_CODED_SLICE_RADL_R:
2872    case NAL_UNIT_CODED_SLICE_RASL_N:
2873    case NAL_UNIT_CODED_SLICE_RASL_R:
2874    case NAL_UNIT_VPS:
2875    case NAL_UNIT_SPS:
2876    case NAL_UNIT_PPS:
2877      m_essentialBytes += *it_stats;
2878      break;
2879    default:
2880      break;
2881    }
2882
2883    m_totalBytes += *it_stats;
2884  }
2885}
2886
2887Void TAppEncTop::printRateSummary()
2888{
2889#if SVC_EXTENSION
2890  Double time = (Double) m_iFrameRcvd / m_acLayerCfg[m_numLayers-1].getFrameRate();
2891#else
2892  Double time = (Double) m_iFrameRcvd / m_iFrameRate;
2893#endif
2894  printf("Bytes written to file: %u (%.3f kbps)\n", m_totalBytes, 0.008 * m_totalBytes / time);
2895#if VERBOSE_RATE
2896  printf("Bytes for SPS/PPS/Slice (Incl. Annex B): %u (%.3f kbps)\n", m_essentialBytes, 0.008 * m_essentialBytes / time);
2897#endif
2898}
2899
2900#if !SVC_EXTENSION
2901Void TAppEncTop::printChromaFormat()
2902{
2903  std::cout << std::setw(43) << "Input ChromaFormatIDC = ";
2904  switch (m_InputChromaFormatIDC)
2905  {
2906  case CHROMA_400:  std::cout << "  4:0:0"; break;
2907  case CHROMA_420:  std::cout << "  4:2:0"; break;
2908  case CHROMA_422:  std::cout << "  4:2:2"; break;
2909  case CHROMA_444:  std::cout << "  4:4:4"; break;
2910  default:
2911    std::cerr << "Invalid";
2912    exit(1);
2913  }
2914  std::cout << std::endl;
2915
2916  std::cout << std::setw(43) << "Output (internal) ChromaFormatIDC = ";
2917  switch (m_cTEncTop.getChromaFormatIdc())
2918  {
2919  case CHROMA_400:  std::cout << "  4:0:0"; break;
2920  case CHROMA_420:  std::cout << "  4:2:0"; break;
2921  case CHROMA_422:  std::cout << "  4:2:2"; break;
2922  case CHROMA_444:  std::cout << "  4:4:4"; break;
2923  default:
2924    std::cerr << "Invalid";
2925    exit(1);
2926  }
2927  std::cout << "\n" << std::endl;
2928}
2929#endif
2930
2931//! \}
Note: See TracBrowser for help on using the repository browser.