source: SHVCSoftware/branches/SHM-temp/source/App/TAppEncoder/TAppEncTop.cpp @ 1557

Last change on this file since 1557 was 1037, checked in by seregin, 10 years ago

implementation of alpha channel SEI (JCTVC-P0123) with macro P0123_ALPHA_CHANNEL_SEI, patch was provided by Matteo Naccari <Matteo.Naccari@…>

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