source: 3DVCSoftware/branches/HTM-4.0.1-VSP-dev0/source/App/TAppEncoder/TAppEncTop.cpp @ 213

Last change on this file since 213 was 213, checked in by mitsubishi-htm, 11 years ago

A final release, as planned

  • Migrate to HTM 5.1
  • For VC project files, only VC9 file is updated
  • To be used as an additional anchor for CE1.h for 3rd JCTVC meeting at Geneva
  • Property svn:eol-style set to native
File size: 74.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-2012, 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
45#include "TAppEncTop.h"
46#include "TLibEncoder/AnnexBwrite.h"
47
48using namespace std;
49
50//! \ingroup TAppEncoder
51//! \{
52
53// ====================================================================================================================
54// Constructor / destructor / initialization / destroy
55// ====================================================================================================================
56
57TAppEncTop::TAppEncTop()
58{
59  m_totalBytes = 0;
60  m_essentialBytes = 0;
61}
62
63TAppEncTop::~TAppEncTop()
64{
65}
66
67Void TAppEncTop::xInitLibCfg()
68{
69#if VIDYO_VPS_INTEGRATION|QC_MVHEVC_B0046
70#if !QC_MVHEVC_B0046
71  UInt layerId = 0;
72#endif
73  // TODO: fix the assumption here that the temporal structures are all equal across all layers???
74  m_cVPS.setMaxTLayers( m_maxTempLayer[0] );
75#if QC_MVHEVC_B0046
76  m_cVPS.setMaxLayers( m_iNumberOfViews );
77#else
78  m_cVPS.setMaxLayers( m_iNumberOfViews * (m_bUsingDepthMaps ? 2:1) );
79#endif
80  for(Int i = 0; i < MAX_TLAYER; i++)
81  {
82    m_cVPS.setNumReorderPics( m_numReorderPics[0][i], i );
83    m_cVPS.setMaxDecPicBuffering( m_maxDecPicBuffering[0][i], i );
84  }
85#endif
86 
87  for(Int iViewIdx=0; iViewIdx<m_iNumberOfViews; iViewIdx++)
88  {
89#if VSP_N
90#if FLEX_CODING_ORDER_M23723
91      Bool isTextureFirst = false;
92      if ( m_b3DVFlexOrder )
93      {
94        for ( Int ii=1; ii<12; ii+=2 )
95        {
96          Int iViewIdxCfg = (Int)(m_pchMVCJointCodingOrder[ii]-'0');
97          if ( iViewIdxCfg == iViewIdx )
98          {
99            if ( m_pchMVCJointCodingOrder[ii-1]=='T' )
100            {
101              isTextureFirst = true;
102            }
103            else
104            {
105              assert(m_pchMVCJointCodingOrder[ii-1]=='D');
106            }
107            break;
108          }
109        }
110      }
111      else
112      {
113        isTextureFirst = true;
114      }
115#endif
116#endif
117    m_frameRcvd.push_back(0);
118    m_acTEncTopList.push_back(new TEncTop); 
119    m_acTVideoIOYuvInputFileList.push_back(new TVideoIOYuv);
120    m_acTVideoIOYuvReconFileList.push_back(new TVideoIOYuv);
121    m_picYuvRec.push_back(new TComList<TComPicYuv*>) ;
122
123    m_acTEncTopList[iViewIdx]->setFrameRate                    ( m_iFrameRate );
124    m_acTEncTopList[iViewIdx]->setFrameSkip                    ( m_FrameSkip );
125    m_acTEncTopList[iViewIdx]->setSourceWidth                  ( m_iSourceWidth );
126    m_acTEncTopList[iViewIdx]->setSourceHeight                 ( m_iSourceHeight );
127#if PIC_CROPPING
128    m_acTEncTopList[iViewIdx]->setCroppingMode                 ( m_croppingMode );
129    m_acTEncTopList[iViewIdx]->setCropLeft                     ( m_cropLeft );
130    m_acTEncTopList[iViewIdx]->setCropRight                    ( m_cropRight );
131    m_acTEncTopList[iViewIdx]->setCropTop                      ( m_cropTop );
132    m_acTEncTopList[iViewIdx]->setCropBottom                   ( m_cropBottom );
133#endif
134    m_acTEncTopList[iViewIdx]->setFrameToBeEncoded             ( m_iFrameToBeEncoded );
135    m_acTEncTopList[iViewIdx]->setViewId                       ( iViewIdx );
136    m_acTEncTopList[iViewIdx]->setIsDepth                      ( false );
137#if QC_MVHEVC_B0046
138    m_acTEncTopList[iViewIdx]->setLayerId                      ( iViewIdx );
139    m_cVPS.setViewId                                           ( m_aiVId[ iViewIdx ], iViewIdx );
140#else
141    m_acTEncTopList[iViewIdx]->setViewOrderIdx                 ( m_cCameraData.getViewOrderIndex()[ iViewIdx ] );
142#if VIDYO_VPS_INTEGRATION
143    layerId = iViewIdx * (m_bUsingDepthMaps ? 2:1);
144    m_acTEncTopList[iViewIdx]->setLayerId                      ( layerId );
145    m_cVPS.setDepthFlag                                        ( false, layerId );
146    m_cVPS.setViewId                                           ( iViewIdx, layerId );
147    m_cVPS.setViewOrderIdx                                     ( m_cCameraData.getViewOrderIndex()[ iViewIdx ], layerId );
148    // TODO: set correct dependentFlag and dependentLayer
149    m_cVPS.setDependentFlag                                    ( iViewIdx ? true:false, layerId );
150    m_cVPS.setDependentLayer                                   ( layerId - (m_bUsingDepthMaps ? 2:1), layerId );
151#endif
152   
153#if VSP_N
154    m_acTEncTopList[iViewIdx]->setCamParPrecision              ( m_cCameraData.getCamParsCodedPrecision  () );
155    m_acTEncTopList[iViewIdx]->setCamParInSliceHeader          ( m_cCameraData.getVaryingCameraParameters() );
156    m_acTEncTopList[iViewIdx]->setCodedScale                   ( m_cCameraData.getCodedScale             () );
157    m_acTEncTopList[iViewIdx]->setCodedOffset                  ( m_cCameraData.getCodedOffset            () );
158#else
159    m_acTEncTopList[iViewIdx]->setCamParPrecision              ( 0 );
160    m_acTEncTopList[iViewIdx]->setCamParInSliceHeader          ( false );
161    m_acTEncTopList[iViewIdx]->setCodedScale                   ( 0 );
162    m_acTEncTopList[iViewIdx]->setCodedOffset                  ( 0 );
163#endif
164#endif   
165
166  //====== Coding Structure ========
167    m_acTEncTopList[iViewIdx]->setIntraPeriod                  ( m_iIntraPeriod );
168    m_acTEncTopList[iViewIdx]->setDecodingRefreshType          ( m_iDecodingRefreshType );
169    m_acTEncTopList[iViewIdx]->setGOPSize                      ( m_iGOPSize );
170    m_acTEncTopList[iViewIdx]->setGopList                      ( m_GOPListsMvc[iViewIdx] );
171    m_acTEncTopList[iViewIdx]->setExtraRPSs                    ( m_extraRPSs[iViewIdx] );
172#if H0567_DPB_PARAMETERS_PER_TEMPORAL_LAYER
173    for(Int i = 0; i < MAX_TLAYER; i++)
174    {
175      m_acTEncTopList[iViewIdx]->setNumReorderPics             ( m_numReorderPics[iViewIdx][i], i );
176      m_acTEncTopList[iViewIdx]->setMaxDecPicBuffering         ( m_maxDecPicBuffering[iViewIdx][i], i );
177    }
178#else
179    m_acTEncTopList[iViewIdx]->setNumReorderFrames             ( m_numReorderFrames );
180    m_acTEncTopList[iViewIdx]->setMaxNumberOfReferencePictures ( m_maxNumberOfReferencePictures );
181#endif
182    for( UInt uiLoop = 0; uiLoop < MAX_TLAYER; ++uiLoop )
183    {
184      m_acTEncTopList[iViewIdx]->setLambdaModifier( uiLoop, m_adLambdaModifier[ uiLoop ] );
185    }
186    m_acTEncTopList[iViewIdx]->setQP                           ( m_aiQP[0] );
187 
188    m_acTEncTopList[iViewIdx]->setTemporalLayerQPOffset        ( m_aiTLayerQPOffset );
189    m_acTEncTopList[iViewIdx]->setPad                          ( m_aiPad );
190   
191#if H0566_TLA
192    m_acTEncTopList[iViewIdx]->setMaxTempLayer                 ( m_maxTempLayer[iViewIdx] );
193#else
194    m_acTEncTopList[iViewIdx]->setTLayering                    ( m_bTLayering );
195    m_acTEncTopList[iViewIdx]->setTLayerSwitchingFlag          ( m_abTLayerSwitchingFlag );
196#endif
197
198    m_acTEncTopList[iViewIdx]->setDisInter4x4                  ( m_bDisInter4x4);
199 
200    m_acTEncTopList[iViewIdx]->setUseNSQT( m_enableNSQT );
201    m_acTEncTopList[iViewIdx]->setUseAMP( m_enableAMP );
202 
203  //===== Slice ========
204 
205  //====== Loop/Deblock Filter ========
206    m_acTEncTopList[iViewIdx]->setLoopFilterDisable            ( m_abLoopFilterDisable[0]       );
207    m_acTEncTopList[iViewIdx]->setLoopFilterOffsetInAPS        ( m_loopFilterOffsetInAPS );
208    m_acTEncTopList[iViewIdx]->setLoopFilterBetaOffset         ( m_loopFilterBetaOffsetDiv2  );
209    m_acTEncTopList[iViewIdx]->setLoopFilterTcOffset           ( m_loopFilterTcOffsetDiv2    );
210#if DBL_CONTROL
211    m_acTEncTopList[iViewIdx]->setDeblockingFilterControlPresent( m_DeblockingFilterControlPresent);
212#endif
213
214  //====== Motion search ========
215    m_acTEncTopList[iViewIdx]->setFastSearch                   ( m_iFastSearch  );
216    m_acTEncTopList[iViewIdx]->setSearchRange                  ( m_iSearchRange );
217    m_acTEncTopList[iViewIdx]->setBipredSearchRange            ( m_bipredSearchRange );
218#if DV_V_RESTRICTION_B0037
219    m_acTEncTopList[iViewIdx]->setUseDisparitySearchRangeRestriction ( m_bUseDisparitySearchRangeRestriction );
220    m_acTEncTopList[iViewIdx]->setVerticalDisparitySearchRange( m_iVerticalDisparitySearchRange );
221#endif
222  //====== Quality control ========
223    m_acTEncTopList[iViewIdx]->setMaxDeltaQP                   ( m_iMaxDeltaQP  );
224    m_acTEncTopList[iViewIdx]->setMaxCuDQPDepth                ( m_iMaxCuDQPDepth  );
225
226    m_acTEncTopList[iViewIdx]->setChromaQpOffset               ( m_iChromaQpOffset     );
227    m_acTEncTopList[iViewIdx]->setChromaQpOffset2nd            ( m_iChromaQpOffset2nd  );
228
229#if ADAPTIVE_QP_SELECTION
230    m_acTEncTopList[iViewIdx]->setUseAdaptQpSelect             ( m_bUseAdaptQpSelect   );
231#endif
232
233#if LOSSLESS_CODING
234    Int lowestQP;
235#if H0736_AVC_STYLE_QP_RANGE
236    lowestQP =  - ( (Int)(6*(g_uiBitDepth + g_uiBitIncrement - 8)) );
237#else
238    lowestQP = 0;
239#endif
240    if ((m_iMaxDeltaQP == 0 ) && (m_aiQP[0] == lowestQP) && (m_useLossless == true))
241    {
242      m_bUseAdaptiveQP = false;
243    }
244#endif
245
246    m_acTEncTopList[iViewIdx]->setUseAdaptiveQP                ( m_bUseAdaptiveQP  );
247    m_acTEncTopList[iViewIdx]->setQPAdaptationRange            ( m_iQPAdaptationRange );
248 
249#if HHI_VSO
250    //====== VSO =========
251    m_acTEncTopList[iViewIdx]->setForceLambdaScaleVSO          ( false );
252    m_acTEncTopList[iViewIdx]->setLambdaScaleVSO               ( 1     );
253    m_acTEncTopList[iViewIdx]->setVSOMode                      ( 0     );
254    m_acTEncTopList[iViewIdx]->setUseVSO                       ( false ); 
255#if SAIT_VSO_EST_A0033
256    m_acTEncTopList[iViewIdx]->setUseEstimatedVSD              ( false );
257#endif
258#if LGE_WVSO_A0119
259    m_acTEncTopList[iViewIdx]->setUseWVSO                      ( false ); 
260#endif
261#endif
262
263#if DEPTH_MAP_GENERATION
264    m_acTEncTopList[iViewIdx]->setPredDepthMapGeneration       ( m_uiPredDepthMapGeneration );
265    m_acTEncTopList[iViewIdx]->setPdmPrecision                 ( (UInt)m_cCameraData.getPdmPrecision     () );
266    m_acTEncTopList[iViewIdx]->setPdmScaleNomDelta             (       m_cCameraData.getPdmScaleNomDelta () );
267    m_acTEncTopList[iViewIdx]->setPdmOffset                    (       m_cCameraData.getPdmOffset        () );
268#endif
269#if HHI_INTER_VIEW_MOTION_PRED
270    m_acTEncTopList[iViewIdx]->setMultiviewMvPredMode          ( m_uiMultiviewMvPredMode );
271    m_acTEncTopList[iViewIdx]->setMultiviewMvRegMode           ( iViewIdx ? m_uiMultiviewMvRegMode       : 0   );
272    m_acTEncTopList[iViewIdx]->setMultiviewMvRegLambdaScale    ( iViewIdx ? m_dMultiviewMvRegLambdaScale : 0.0 );
273#endif
274#if HHI_INTER_VIEW_RESIDUAL_PRED
275    m_acTEncTopList[iViewIdx]->setMultiviewResPredMode         ( m_uiMultiviewResPredMode );
276#endif
277
278  //====== Tool list ========
279    m_acTEncTopList[iViewIdx]->setUseSBACRD                    ( m_bUseSBACRD   );
280    m_acTEncTopList[iViewIdx]->setDeltaQpRD                    ( m_uiDeltaQpRD  );
281    m_acTEncTopList[iViewIdx]->setUseASR                       ( m_bUseASR      );
282    m_acTEncTopList[iViewIdx]->setUseHADME                     ( m_bUseHADME    );
283    m_acTEncTopList[iViewIdx]->setUseALF                       ( m_abUseALF[0]  );
284    m_acTEncTopList[iViewIdx]->setALFEncodePassReduction       ( m_iALFEncodePassReduction );
285#if LOSSLESS_CODING
286    m_acTEncTopList[iViewIdx]->setUseLossless                  ( m_useLossless );
287#endif
288    m_acTEncTopList[iViewIdx]->setALFMaxNumberFilters          ( m_iALFMaxNumberFilters ) ;
289
290    m_acTEncTopList[iViewIdx]->setUseLComb                     ( m_bUseLComb    );
291    m_acTEncTopList[iViewIdx]->setLCMod                        ( m_bLCMod         );
292    m_acTEncTopList[iViewIdx]->setdQPs                         ( m_aidQP        );
293    m_acTEncTopList[iViewIdx]->setUseRDOQ                      ( m_abUseRDOQ[0] );
294#if !PIC_CROPPING
295    m_acTEncTopList[iViewIdx]->setUsePAD                       ( m_bUsePAD      );
296#endif
297    m_acTEncTopList[iViewIdx]->setQuadtreeTULog2MaxSize        ( m_uiQuadtreeTULog2MaxSize );
298    m_acTEncTopList[iViewIdx]->setQuadtreeTULog2MinSize        ( m_uiQuadtreeTULog2MinSize );
299    m_acTEncTopList[iViewIdx]->setQuadtreeTUMaxDepthInter      ( m_uiQuadtreeTUMaxDepthInter );
300    m_acTEncTopList[iViewIdx]->setQuadtreeTUMaxDepthIntra      ( m_uiQuadtreeTUMaxDepthIntra );
301    m_acTEncTopList[iViewIdx]->setUseFastEnc                   ( m_bUseFastEnc  );
302    m_acTEncTopList[iViewIdx]->setUseEarlyCU                   ( m_bUseEarlyCU  ); 
303#if FAST_DECISION_FOR_MRG_RD_COST
304    m_acTEncTopList[iViewIdx]->setUseFastDecisionForMerge      ( m_useFastDecisionForMerge  );
305#endif
306    m_acTEncTopList[iViewIdx]->setUseCbfFastMode               ( m_bUseCbfFastMode  );
307#if HHI_INTERVIEW_SKIP
308    m_acTEncTopList[iViewIdx]->setInterViewSkip            ( iViewIdx>0 ? m_bInterViewSkip : false );
309#if HHI_INTERVIEW_SKIP_LAMBDA_SCALE
310    m_acTEncTopList[iViewIdx]->setInterViewSkipLambdaScale ( iViewIdx>0 ? (UInt)m_dInterViewSkipLambdaScale : 1 );
311#endif
312#endif
313    m_acTEncTopList[iViewIdx]->setUseLMChroma                  ( m_bUseLMChroma );
314    m_acTEncTopList[iViewIdx]->setUseConstrainedIntraPred      ( m_bUseConstrainedIntraPred );
315    m_acTEncTopList[iViewIdx]->setPCMLog2MinSize               ( m_uiPCMLog2MinSize);
316    m_acTEncTopList[iViewIdx]->setUsePCM                       ( m_usePCM );
317    m_acTEncTopList[iViewIdx]->setPCMLog2MaxSize               ( m_pcmLog2MaxSize);
318
319  //====== Weighted Prediction ========
320    m_acTEncTopList[iViewIdx]->setUseWP                        ( m_bUseWeightPred      );
321    m_acTEncTopList[iViewIdx]->setWPBiPredIdc                  ( m_uiBiPredIdc         );
322  //====== Slice ========
323    m_acTEncTopList[iViewIdx]->setSliceMode                    ( m_iSliceMode                );
324    m_acTEncTopList[iViewIdx]->setSliceArgument                ( m_iSliceArgument            );
325
326  //====== Entropy Slice ========
327    m_acTEncTopList[iViewIdx]->setEntropySliceMode             ( m_iEntropySliceMode         );
328    m_acTEncTopList[iViewIdx]->setEntropySliceArgument         ( m_iEntropySliceArgument     );
329    int iNumPartInCU = 1<<(m_uiMaxCUDepth<<1);
330    if(m_iEntropySliceMode==SHARP_FIXED_NUMBER_OF_LCU_IN_ENTROPY_SLICE)
331    {
332      m_acTEncTopList[iViewIdx]->setEntropySliceArgument ( m_iEntropySliceArgument * ( iNumPartInCU >> ( m_iSliceGranularity << 1 ) ) );
333    }
334    if(m_iSliceMode==AD_HOC_SLICES_FIXED_NUMBER_OF_LCU_IN_SLICE)
335    {
336      m_acTEncTopList[iViewIdx]->setSliceArgument ( m_iSliceArgument * ( iNumPartInCU >> ( m_iSliceGranularity << 1 ) ) );
337    }
338#if FIXED_NUMBER_OF_TILES_SLICE_MODE
339    if(m_iSliceMode==AD_HOC_SLICES_FIXED_NUMBER_OF_TILES_IN_SLICE)
340    {
341      m_acTEncTopList[iViewIdx]->setSliceArgument ( m_iSliceArgument );
342    }
343#endif
344    m_acTEncTopList[iViewIdx]->setSliceGranularity        ( m_iSliceGranularity         );
345    if(m_iSliceMode == 0 )
346    {
347      m_bLFCrossSliceBoundaryFlag = true;
348    }
349    m_acTEncTopList[iViewIdx]->setLFCrossSliceBoundaryFlag( m_bLFCrossSliceBoundaryFlag );
350    m_acTEncTopList[iViewIdx]->setUseSAO               ( m_abUseSAO[0]     );
351#if LGE_ILLUCOMP_B0045
352    m_acTEncTopList[iViewIdx]->setUseIC                ( m_bUseIC          );
353#endif
354#if SAO_UNIT_INTERLEAVING
355    m_acTEncTopList[iViewIdx]->setMaxNumOffsetsPerPic (m_maxNumOffsetsPerPic);
356    m_acTEncTopList[iViewIdx]->setSaoInterleavingFlag (m_saoInterleavingFlag);
357#endif
358    m_acTEncTopList[iViewIdx]->setPCMInputBitDepthFlag  ( m_bPCMInputBitDepthFlag); 
359    m_acTEncTopList[iViewIdx]->setPCMFilterDisableFlag  ( m_bPCMFilterDisableFlag); 
360
361    m_acTEncTopList[iViewIdx]->setPictureDigestEnabled(m_pictureDigestEnabled);
362
363    m_acTEncTopList[iViewIdx]->setColumnRowInfoPresent       ( m_iColumnRowInfoPresent );
364    m_acTEncTopList[iViewIdx]->setUniformSpacingIdr          ( m_iUniformSpacingIdr );
365#if !REMOVE_TILE_DEPENDENCE
366    m_acTEncTopList[iViewIdx]->setTileBoundaryIndependenceIdr( m_iTileBoundaryIndependenceIdr );
367#endif
368    m_acTEncTopList[iViewIdx]->setNumColumnsMinus1           ( m_iNumColumnsMinus1 );
369    m_acTEncTopList[iViewIdx]->setNumRowsMinus1              ( m_iNumRowsMinus1 );
370    if(m_iUniformSpacingIdr==0)
371    {
372      m_acTEncTopList[iViewIdx]->setColumnWidth              ( m_pchColumnWidth );
373      m_acTEncTopList[iViewIdx]->setRowHeight                ( m_pchRowHeight );
374    }
375    m_acTEncTopList[iViewIdx]->xCheckGSParameters();
376    m_acTEncTopList[iViewIdx]->setTileLocationInSliceHeaderFlag ( m_iTileLocationInSliceHeaderFlag );
377    m_acTEncTopList[iViewIdx]->setTileMarkerFlag              ( m_iTileMarkerFlag );
378    m_acTEncTopList[iViewIdx]->setMaxTileMarkerEntryPoints    ( m_iMaxTileMarkerEntryPoints );
379 
380    Int uiTilesCount          = (m_iNumRowsMinus1+1) * (m_iNumColumnsMinus1+1);
381    m_dMaxTileMarkerOffset    = ((Double)uiTilesCount) / m_iMaxTileMarkerEntryPoints;
382    m_acTEncTopList[iViewIdx]->setMaxTileMarkerOffset         ( m_dMaxTileMarkerOffset );
383    m_acTEncTopList[iViewIdx]->setTileBehaviorControlPresentFlag( m_iTileBehaviorControlPresentFlag );
384#if !REMOVE_TILE_DEPENDENCE
385    if(m_iTileBoundaryIndependenceIdr == 0 || uiTilesCount == 1)
386#else
387    if(uiTilesCount == 1)
388#endif
389    {
390      m_bLFCrossTileBoundaryFlag = true; 
391    }
392    m_acTEncTopList[iViewIdx]->setLFCrossTileBoundaryFlag( m_bLFCrossTileBoundaryFlag );
393    m_acTEncTopList[iViewIdx]->setWaveFrontSynchro           ( m_iWaveFrontSynchro );
394    m_acTEncTopList[iViewIdx]->setWaveFrontFlush             ( m_iWaveFrontFlush );
395    m_acTEncTopList[iViewIdx]->setWaveFrontSubstreams        ( m_iWaveFrontSubstreams );
396#if TMVP_DEPTH_SWITCH
397    m_acTEncTopList[iViewIdx]->setEnableTMVP                 ( m_enableTMVP[0] );
398#else
399    m_acTEncTopList[iViewIdx]->setEnableTMVP ( m_enableTMVP );
400#endif
401    m_acTEncTopList[iViewIdx]->setUseScalingListId           ( m_useScalingListId  );
402    m_acTEncTopList[iViewIdx]->setScalingListFile            ( m_scalingListFile   );
403#if MULTIBITS_DATA_HIDING
404    m_acTEncTopList[iViewIdx]->setSignHideFlag(m_signHideFlag);
405    m_acTEncTopList[iViewIdx]->setTSIG(m_signHidingThreshold);
406#endif
407
408#if LCU_SYNTAX_ALF
409    if(uiTilesCount > 1)
410    {
411      m_bALFParamInSlice = false;
412      m_bALFPicBasedEncode = true;
413    }
414    m_acTEncTopList[iViewIdx]->setALFParamInSlice              ( m_bALFParamInSlice);
415    m_acTEncTopList[iViewIdx]->setALFPicBasedEncode            ( m_bALFPicBasedEncode);
416#endif
417
418    //====== Depth tools ========
419#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
420    m_acTEncTopList[iViewIdx]->setUseDMM                     ( false );
421#endif
422#if OL_QTLIMIT_PREDCODING_B0068
423    m_acTEncTopList[iViewIdx]->setUseQTLPC                   ( false );
424#endif
425#if HHI_MPI
426    m_acTEncTopList[iViewIdx]->setUseMVI( false );
427#endif
428#if RWTH_SDC_DLT_B0036
429    m_acTEncTopList[iViewIdx]->setUseDLT                      ( false );
430    m_acTEncTopList[iViewIdx]->setUseSDC                      ( false );
431#endif
432
433#if VSP_N
434    m_acTEncTopList[iViewIdx]->setUseVSP( m_bUseVSP );
435    m_acTEncTopList[iViewIdx]->setVSPDepthDisable( m_bVSPDepthDisable );
436#if FLEX_CODING_ORDER_M23723
437    m_acTEncTopList[iViewIdx]->setIsFirstInView( isTextureFirst );
438#else
439    m_acTEncTopList[iViewIdx]->setIsFirstInView( true );
440#endif
441#endif
442  }
443  if( m_bUsingDepthMaps )
444  {
445    for(Int iViewIdx=0; iViewIdx<m_iNumberOfViews; iViewIdx++)
446    {
447
448#if FLEX_CODING_ORDER_M23723
449      // Detect whether depth comes before than texture for this view
450      Bool isDepthFirst = false;
451      if ( m_b3DVFlexOrder )
452      {
453        for ( Int ii=1; ii<12; ii+=2 )
454        {
455          Int iViewIdxCfg = (Int)(m_pchMVCJointCodingOrder[ii]-'0');
456          if ( iViewIdxCfg == iViewIdx )
457          {
458            if ( m_pchMVCJointCodingOrder[ii-1]=='D' ) // depth comes first for this view
459            {
460              isDepthFirst = true;
461            }
462            else
463            {
464              assert(m_pchMVCJointCodingOrder[ii-1]=='T');
465            }
466            break;
467          }
468        }
469      }
470#endif
471
472      m_depthFrameRcvd.push_back(0);
473      m_acTEncDepthTopList.push_back(new TEncTop); 
474      m_acTVideoIOYuvDepthInputFileList.push_back(new TVideoIOYuv);
475      m_acTVideoIOYuvDepthReconFileList.push_back(new TVideoIOYuv);
476      m_picYuvDepthRec.push_back(new TComList<TComPicYuv*>) ;
477
478      m_acTEncDepthTopList[iViewIdx]->setFrameRate                    ( m_iFrameRate );
479      m_acTEncDepthTopList[iViewIdx]->setFrameSkip                    ( m_FrameSkip );
480      m_acTEncDepthTopList[iViewIdx]->setSourceWidth                  ( m_iSourceWidth );
481      m_acTEncDepthTopList[iViewIdx]->setSourceHeight                 ( m_iSourceHeight );
482#if PIC_CROPPING
483      m_acTEncDepthTopList[iViewIdx]->setCroppingMode                 ( m_croppingMode );
484      m_acTEncDepthTopList[iViewIdx]->setCropLeft                     ( m_cropLeft );
485      m_acTEncDepthTopList[iViewIdx]->setCropRight                    ( m_cropRight );
486      m_acTEncDepthTopList[iViewIdx]->setCropTop                      ( m_cropTop );
487      m_acTEncDepthTopList[iViewIdx]->setCropBottom                   ( m_cropBottom );
488#endif
489      m_acTEncDepthTopList[iViewIdx]->setFrameToBeEncoded             ( m_iFrameToBeEncoded );
490      m_acTEncDepthTopList[iViewIdx]->setViewId                       ( iViewIdx );
491      m_acTEncDepthTopList[iViewIdx]->setIsDepth                      ( true );
492#if QC_MVHEVC_B0046
493      m_acTEncDepthTopList[iViewIdx]->setLayerId                      ( iViewIdx );
494#else
495      m_acTEncDepthTopList[iViewIdx]->setViewOrderIdx                 ( m_cCameraData.getViewOrderIndex()[ iViewIdx ] );
496#endif
497#if VIDYO_VPS_INTEGRATION
498      layerId = iViewIdx * 2 + 1;
499      m_acTEncDepthTopList[iViewIdx]->setLayerId                      ( layerId );
500      m_cVPS.setDepthFlag                                             ( true, layerId );
501      m_cVPS.setViewId                                                ( iViewIdx, layerId );
502      m_cVPS.setViewOrderIdx                                          ( m_cCameraData.getViewOrderIndex()[ iViewIdx ], layerId );
503      m_cVPS.setDependentFlag                                         ( true, layerId );
504      m_cVPS.setDependentLayer                                        ( layerId-1, layerId);
505#endif
506
507#if VSP_N
508      m_acTEncDepthTopList[iViewIdx]->setCamParPrecision              ( m_cCameraData.getCamParsCodedPrecision  () );
509      m_acTEncDepthTopList[iViewIdx]->setCamParInSliceHeader          ( m_cCameraData.getVaryingCameraParameters() );
510      m_acTEncDepthTopList[iViewIdx]->setCodedScale                   ( m_cCameraData.getCodedScale             () );
511      m_acTEncDepthTopList[iViewIdx]->setCodedOffset                  ( m_cCameraData.getCodedOffset            () );
512#else
513      m_acTEncDepthTopList[iViewIdx]->setCamParPrecision              ( 0 );
514      m_acTEncDepthTopList[iViewIdx]->setCamParInSliceHeader          ( false );
515      m_acTEncDepthTopList[iViewIdx]->setCodedScale                   ( 0 );
516      m_acTEncDepthTopList[iViewIdx]->setCodedOffset                  ( 0 );
517#endif
518
519      //====== Coding Structure ========
520      m_acTEncDepthTopList[iViewIdx]->setIntraPeriod                  ( m_iIntraPeriod );
521      m_acTEncDepthTopList[iViewIdx]->setDecodingRefreshType          ( m_iDecodingRefreshType );
522      m_acTEncDepthTopList[iViewIdx]->setGOPSize                      ( m_iGOPSize );
523      m_acTEncDepthTopList[iViewIdx]->setGopList                      ( m_GOPListsMvc[iViewIdx] );
524      m_acTEncDepthTopList[iViewIdx]->setExtraRPSs                    ( m_extraRPSs[iViewIdx] );
525#if H0567_DPB_PARAMETERS_PER_TEMPORAL_LAYER
526      for(Int i = 0; i < MAX_TLAYER; i++)
527      {
528        m_acTEncDepthTopList[iViewIdx]->setNumReorderPics             ( m_numReorderPics[iViewIdx][i], i );
529        m_acTEncDepthTopList[iViewIdx]->setMaxDecPicBuffering         ( m_maxDecPicBuffering[iViewIdx][i], i );
530      }
531#else
532      m_acTEncDepthTopList[iViewIdx]->setNumReorderFrames             ( m_numReorderFrames );
533      m_acTEncDepthTopList[iViewIdx]->setMaxNumberOfReferencePictures ( m_maxNumberOfReferencePictures );
534#endif
535      for( UInt uiLoop = 0; uiLoop < MAX_TLAYER; ++uiLoop )
536      {
537        m_acTEncDepthTopList[iViewIdx]->setLambdaModifier( uiLoop, m_adLambdaModifier[ uiLoop ] );
538      }
539      m_acTEncDepthTopList[iViewIdx]->setQP                           ( m_aiQP[1] );
540
541      m_acTEncDepthTopList[iViewIdx]->setTemporalLayerQPOffset        ( m_aiTLayerQPOffset );
542      m_acTEncDepthTopList[iViewIdx]->setPad                          ( m_aiPad );
543
544#if H0566_TLA
545      m_acTEncDepthTopList[iViewIdx]->setMaxTempLayer                 ( m_maxTempLayer[iViewIdx] );
546#else
547      m_acTEncDepthTopList[iViewIdx]->setTLayering                    ( m_bTLayering );
548      m_acTEncDepthTopList[iViewIdx]->setTLayerSwitchingFlag          ( m_abTLayerSwitchingFlag );
549#endif
550
551      m_acTEncDepthTopList[iViewIdx]->setDisInter4x4                  ( m_bDisInter4x4);
552
553      m_acTEncDepthTopList[iViewIdx]->setUseNSQT( m_enableNSQT );
554      m_acTEncDepthTopList[iViewIdx]->setUseAMP( m_enableAMP );
555
556      //===== Slice ========
557
558      //====== Loop/Deblock Filter ========
559      m_acTEncDepthTopList[iViewIdx]->setLoopFilterDisable            ( m_abLoopFilterDisable[1]   );
560      m_acTEncDepthTopList[iViewIdx]->setLoopFilterOffsetInAPS        ( m_loopFilterOffsetInAPS );
561      m_acTEncDepthTopList[iViewIdx]->setLoopFilterBetaOffset         ( m_loopFilterBetaOffsetDiv2  );
562      m_acTEncDepthTopList[iViewIdx]->setLoopFilterTcOffset           ( m_loopFilterTcOffsetDiv2    );
563#if DBL_CONTROL
564      m_acTEncDepthTopList[iViewIdx]->setDeblockingFilterControlPresent( m_DeblockingFilterControlPresent);
565#endif
566
567      //====== Motion search ========
568      m_acTEncDepthTopList[iViewIdx]->setFastSearch                   ( m_iFastSearch  );
569      m_acTEncDepthTopList[iViewIdx]->setSearchRange                  ( m_iSearchRange );
570      m_acTEncDepthTopList[iViewIdx]->setBipredSearchRange            ( m_bipredSearchRange );
571#if DV_V_RESTRICTION_B0037
572      m_acTEncDepthTopList[iViewIdx]->setUseDisparitySearchRangeRestriction ( m_bUseDisparitySearchRangeRestriction );
573      m_acTEncDepthTopList[iViewIdx]->setVerticalDisparitySearchRange( m_iVerticalDisparitySearchRange );
574#endif
575      //====== Quality control ========
576      m_acTEncDepthTopList[iViewIdx]->setMaxDeltaQP                   ( m_iMaxDeltaQP  );
577      m_acTEncDepthTopList[iViewIdx]->setMaxCuDQPDepth                ( m_iMaxCuDQPDepth  );
578
579      m_acTEncDepthTopList[iViewIdx]->setChromaQpOffset               ( m_iChromaQpOffset     );
580      m_acTEncDepthTopList[iViewIdx]->setChromaQpOffset2nd            ( m_iChromaQpOffset2nd  );
581
582#if ADAPTIVE_QP_SELECTION
583      m_acTEncDepthTopList[iViewIdx]->setUseAdaptQpSelect             ( m_bUseAdaptQpSelect   );
584#endif
585
586      m_acTEncDepthTopList[iViewIdx]->setUseAdaptiveQP                ( m_bUseAdaptiveQP  );
587      m_acTEncDepthTopList[iViewIdx]->setQPAdaptationRange            ( m_iQPAdaptationRange );
588
589      //====== Tool list ========
590      m_acTEncDepthTopList[iViewIdx]->setUseSBACRD                    ( m_bUseSBACRD   );
591      m_acTEncDepthTopList[iViewIdx]->setDeltaQpRD                    ( m_uiDeltaQpRD  );
592      m_acTEncDepthTopList[iViewIdx]->setUseASR                       ( m_bUseASR      );
593      m_acTEncDepthTopList[iViewIdx]->setUseHADME                     ( m_bUseHADME    );
594      m_acTEncDepthTopList[iViewIdx]->setUseALF                       ( m_abUseALF[1]  );
595      m_acTEncDepthTopList[iViewIdx]->setALFEncodePassReduction       ( m_iALFEncodePassReduction );
596#if LOSSLESS_CODING
597      m_acTEncDepthTopList[iViewIdx]->setUseLossless                  ( m_useLossless );
598#endif
599      m_acTEncDepthTopList[iViewIdx]->setALFMaxNumberFilters          ( m_iALFMaxNumberFilters ) ;
600
601      m_acTEncDepthTopList[iViewIdx]->setUseLComb                     ( m_bUseLComb    );
602      m_acTEncDepthTopList[iViewIdx]->setLCMod                        ( m_bLCMod       );
603      m_acTEncDepthTopList[iViewIdx]->setdQPs                         ( m_aidQPdepth   );
604      m_acTEncDepthTopList[iViewIdx]->setUseRDOQ                      ( m_abUseRDOQ[1] );
605#if !PIC_CROPPING
606      m_acTEncDepthTopList[iViewIdx]->setUsePAD                       ( m_bUsePAD      );
607#endif
608      m_acTEncDepthTopList[iViewIdx]->setQuadtreeTULog2MaxSize        ( m_uiQuadtreeTULog2MaxSize );
609      m_acTEncDepthTopList[iViewIdx]->setQuadtreeTULog2MinSize        ( m_uiQuadtreeTULog2MinSize );
610      m_acTEncDepthTopList[iViewIdx]->setQuadtreeTUMaxDepthInter      ( m_uiQuadtreeTUMaxDepthInter );
611      m_acTEncDepthTopList[iViewIdx]->setQuadtreeTUMaxDepthIntra      ( m_uiQuadtreeTUMaxDepthIntra );
612      m_acTEncDepthTopList[iViewIdx]->setUseFastEnc                   ( m_bUseFastEnc  );
613      m_acTEncDepthTopList[iViewIdx]->setUseEarlyCU                   ( m_bUseEarlyCU  ); 
614#if FAST_DECISION_FOR_MRG_RD_COST
615      m_acTEncDepthTopList[iViewIdx]->setUseFastDecisionForMerge      ( m_useFastDecisionForMerge  );
616#endif
617      m_acTEncDepthTopList[iViewIdx]->setUseCbfFastMode               ( m_bUseCbfFastMode  );
618#if HHI_INTERVIEW_SKIP
619      m_acTEncDepthTopList[iViewIdx]->setInterViewSkip            ( 0 );
620#if HHI_INTERVIEW_SKIP_LAMBDA_SCALE
621      m_acTEncDepthTopList[iViewIdx]->setInterViewSkipLambdaScale ( 1 );
622#endif
623#endif
624      m_acTEncDepthTopList[iViewIdx]->setUseLMChroma                  ( m_bUseLMChroma );
625      m_acTEncDepthTopList[iViewIdx]->setUseConstrainedIntraPred      ( m_bUseConstrainedIntraPred );
626      m_acTEncDepthTopList[iViewIdx]->setPCMLog2MinSize               ( m_uiPCMLog2MinSize);
627      m_acTEncDepthTopList[iViewIdx]->setUsePCM                       ( m_usePCM );
628      m_acTEncDepthTopList[iViewIdx]->setPCMLog2MaxSize               ( m_pcmLog2MaxSize);
629      //====== VSO ========
630#if HHI_VSO
631      m_acTEncDepthTopList[iViewIdx]->setUseVSO                       ( m_bUseVSO      ); //GT: might be enabled/disabled later for VSO Mode 4
632      m_acTEncDepthTopList[iViewIdx]->setForceLambdaScaleVSO          ( m_bForceLambdaScaleVSO );
633      m_acTEncDepthTopList[iViewIdx]->setLambdaScaleVSO               ( m_dLambdaScaleVSO );
634#if HHI_VSO_DIST_INT
635      m_acTEncDepthTopList[iViewIdx]->setAllowNegDist                 ( m_bAllowNegDist );
636#endif
637      m_acTEncDepthTopList[iViewIdx]->setVSOMode                      ( m_uiVSOMode );
638
639#if SAIT_VSO_EST_A0033
640      m_acTEncDepthTopList[iViewIdx]->setUseEstimatedVSD              ( m_bUseEstimatedVSD );
641#endif
642#if LGE_WVSO_A0119
643      m_acTEncDepthTopList[iViewIdx]->setUseWVSO                      ( m_bUseWVSO         );
644#endif
645#endif
646
647#if DEPTH_MAP_GENERATION
648      m_acTEncDepthTopList[iViewIdx]->setPredDepthMapGeneration       ( 0 );
649#endif
650#if HHI_INTER_VIEW_MOTION_PRED
651      m_acTEncDepthTopList[iViewIdx]->setMultiviewMvPredMode          ( 0 );
652      m_acTEncDepthTopList[iViewIdx]->setMultiviewMvRegMode           ( 0 );
653      m_acTEncDepthTopList[iViewIdx]->setMultiviewMvRegLambdaScale    ( 0.0 );
654#endif
655#if HHI_INTER_VIEW_RESIDUAL_PRED
656      m_acTEncDepthTopList[iViewIdx]->setMultiviewResPredMode         ( 0 );
657#endif
658
659      //====== Weighted Prediction ========
660      m_acTEncDepthTopList[iViewIdx]->setUseWP                        ( m_bUseWeightPred      );
661      m_acTEncDepthTopList[iViewIdx]->setWPBiPredIdc                  ( m_uiBiPredIdc         );
662      //====== Slice ========
663      m_acTEncDepthTopList[iViewIdx]->setSliceMode                    ( m_iSliceMode                );
664      m_acTEncDepthTopList[iViewIdx]->setSliceArgument                ( m_iSliceArgument            );
665
666      //====== Entropy Slice ========
667      m_acTEncDepthTopList[iViewIdx]->setEntropySliceMode             ( m_iEntropySliceMode         );
668      m_acTEncDepthTopList[iViewIdx]->setEntropySliceArgument         ( m_iEntropySliceArgument     );
669      int iNumPartInCU = 1<<(m_uiMaxCUDepth<<1);
670      if(m_iEntropySliceMode==SHARP_FIXED_NUMBER_OF_LCU_IN_ENTROPY_SLICE)
671      {
672        m_acTEncDepthTopList[iViewIdx]->setEntropySliceArgument ( m_iEntropySliceArgument * ( iNumPartInCU >> ( m_iSliceGranularity << 1 ) ) );
673      }
674      if(m_iSliceMode==AD_HOC_SLICES_FIXED_NUMBER_OF_LCU_IN_SLICE)
675      {
676        m_acTEncDepthTopList[iViewIdx]->setSliceArgument ( m_iSliceArgument * ( iNumPartInCU >> ( m_iSliceGranularity << 1 ) ) );
677      }
678#if FIXED_NUMBER_OF_TILES_SLICE_MODE
679      if(m_iSliceMode==AD_HOC_SLICES_FIXED_NUMBER_OF_TILES_IN_SLICE)
680      {
681        m_acTEncDepthTopList[iViewIdx]->setSliceArgument ( m_iSliceArgument );
682      }
683#endif
684      m_acTEncDepthTopList[iViewIdx]->setSliceGranularity        ( m_iSliceGranularity         );
685      if(m_iSliceMode == 0 )
686      {
687        m_bLFCrossSliceBoundaryFlag = true;
688      }
689      m_acTEncDepthTopList[iViewIdx]->setLFCrossSliceBoundaryFlag( m_bLFCrossSliceBoundaryFlag );
690      m_acTEncDepthTopList[iViewIdx]->setUseSAO               ( m_abUseSAO[1]     );
691#if LGE_ILLUCOMP_B0045
692      m_acTEncDepthTopList[iViewIdx]->setUseIC                ( false     );
693#endif
694#if SAO_UNIT_INTERLEAVING
695      m_acTEncDepthTopList[iViewIdx]->setMaxNumOffsetsPerPic (m_maxNumOffsetsPerPic);
696      m_acTEncDepthTopList[iViewIdx]->setSaoInterleavingFlag (m_saoInterleavingFlag);
697#endif
698      m_acTEncDepthTopList[iViewIdx]->setPCMInputBitDepthFlag  ( m_bPCMInputBitDepthFlag); 
699      m_acTEncDepthTopList[iViewIdx]->setPCMFilterDisableFlag  ( m_bPCMFilterDisableFlag); 
700
701      m_acTEncDepthTopList[iViewIdx]->setPictureDigestEnabled(m_pictureDigestEnabled);
702
703      m_acTEncDepthTopList[iViewIdx]->setColumnRowInfoPresent       ( m_iColumnRowInfoPresent );
704      m_acTEncDepthTopList[iViewIdx]->setUniformSpacingIdr          ( m_iUniformSpacingIdr );
705#if !REMOVE_TILE_DEPENDENCE
706      m_acTEncDepthTopList[iViewIdx]->setTileBoundaryIndependenceIdr( m_iTileBoundaryIndependenceIdr );
707#endif
708      m_acTEncDepthTopList[iViewIdx]->setNumColumnsMinus1           ( m_iNumColumnsMinus1 );
709      m_acTEncDepthTopList[iViewIdx]->setNumRowsMinus1              ( m_iNumRowsMinus1 );
710      if(m_iUniformSpacingIdr==0)
711      {
712        m_acTEncDepthTopList[iViewIdx]->setColumnWidth              ( m_pchColumnWidth );
713        m_acTEncDepthTopList[iViewIdx]->setRowHeight                ( m_pchRowHeight );
714      }
715      m_acTEncDepthTopList[iViewIdx]->xCheckGSParameters();
716      m_acTEncDepthTopList[iViewIdx]->setTileLocationInSliceHeaderFlag ( m_iTileLocationInSliceHeaderFlag );
717      m_acTEncDepthTopList[iViewIdx]->setTileMarkerFlag              ( m_iTileMarkerFlag );
718      m_acTEncDepthTopList[iViewIdx]->setMaxTileMarkerEntryPoints    ( m_iMaxTileMarkerEntryPoints );
719
720      Int uiTilesCount          = (m_iNumRowsMinus1+1) * (m_iNumColumnsMinus1+1);
721      m_dMaxTileMarkerOffset    = ((Double)uiTilesCount) / m_iMaxTileMarkerEntryPoints;
722      m_acTEncDepthTopList[iViewIdx]->setMaxTileMarkerOffset         ( m_dMaxTileMarkerOffset );
723      m_acTEncDepthTopList[iViewIdx]->setTileBehaviorControlPresentFlag( m_iTileBehaviorControlPresentFlag );
724#if !REMOVE_TILE_DEPENDENCE
725      if(m_iTileBoundaryIndependenceIdr == 0 || uiTilesCount == 1)
726#else
727      if(uiTilesCount == 1)
728#endif
729      {
730        m_bLFCrossTileBoundaryFlag = true; 
731      }
732      m_acTEncDepthTopList[iViewIdx]->setLFCrossTileBoundaryFlag( m_bLFCrossTileBoundaryFlag );
733      m_acTEncDepthTopList[iViewIdx]->setWaveFrontSynchro           ( m_iWaveFrontSynchro );
734      m_acTEncDepthTopList[iViewIdx]->setWaveFrontFlush             ( m_iWaveFrontFlush );
735      m_acTEncDepthTopList[iViewIdx]->setWaveFrontSubstreams        ( m_iWaveFrontSubstreams );
736#if TMVP_DEPTH_SWITCH
737      m_acTEncDepthTopList[iViewIdx]->setEnableTMVP                 ( m_enableTMVP[1] );
738#else
739      m_acTEncDepthTopList[iViewIdx]->setEnableTMVP ( m_enableTMVP );
740#endif
741      m_acTEncDepthTopList[iViewIdx]->setUseScalingListId           ( m_useScalingListId  );
742      m_acTEncDepthTopList[iViewIdx]->setScalingListFile            ( m_scalingListFile   );
743#if MULTIBITS_DATA_HIDING
744      m_acTEncDepthTopList[iViewIdx]->setSignHideFlag(m_signHideFlag);
745      m_acTEncDepthTopList[iViewIdx]->setTSIG(m_signHidingThreshold);
746#endif
747
748#if LCU_SYNTAX_ALF
749      if(uiTilesCount > 1)
750      {
751        m_bALFParamInSlice = false;
752        m_bALFPicBasedEncode = true;
753      }
754      m_acTEncDepthTopList[iViewIdx]->setALFParamInSlice              ( m_bALFParamInSlice);
755      m_acTEncDepthTopList[iViewIdx]->setALFPicBasedEncode            ( m_bALFPicBasedEncode);
756#endif
757
758  //====== Depth tools ========
759#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
760    m_acTEncDepthTopList[iViewIdx]->setUseDMM                     ( m_bUseDMM );
761#endif
762#if FLEX_CODING_ORDER_M23723 && HHI_DMM_PRED_TEX
763    m_acTEncDepthTopList[iViewIdx]->setUseDMM34( (m_b3DVFlexOrder && isDepthFirst) ? false : m_bUseDMM );
764#endif
765
766#if OL_QTLIMIT_PREDCODING_B0068
767    m_acTEncDepthTopList[iViewIdx]->setUseQTLPC                   (m_bUseQTLPC);
768#endif
769#if HHI_MPI
770#if FLEX_CODING_ORDER_M23723
771    m_acTEncDepthTopList[iViewIdx]->setUseMVI( (m_b3DVFlexOrder && isDepthFirst) ? false : m_bUseMVI );
772#else
773    m_acTEncDepthTopList[iViewIdx]->setUseMVI( m_bUseMVI );
774#endif
775#endif
776#if RWTH_SDC_DLT_B0036
777      m_acTEncDepthTopList[iViewIdx]->setUseDLT                   ( m_bUseDLT );
778      m_acTEncDepthTopList[iViewIdx]->setUseSDC                   ( m_bUseSDC );
779#endif
780
781#if VSP_N
782      m_acTEncDepthTopList[iViewIdx]->setUseVSP( m_bUseVSP );
783      m_acTEncDepthTopList[iViewIdx]->setVSPDepthDisable( m_bVSPDepthDisable );
784#if FLEX_CODING_ORDER_M23723
785      m_acTEncDepthTopList[iViewIdx]->setIsFirstInView( isDepthFirst );
786#else
787      m_acTEncDepthTopList[iViewIdx]->setIsFirstInView( false );
788#endif
789#endif
790    }
791  }
792
793#if HHI_INTER_VIEW_MOTION_PRED
794  else if( m_uiMultiviewMvRegMode )
795  {
796    for(Int iViewIdx=0; iViewIdx<m_iNumberOfViews; iViewIdx++)
797    {
798      m_acTVideoIOYuvDepthInputFileList.push_back( new TVideoIOYuv );
799    }
800  }
801#endif
802
803#if HHI_VSO
804  if ( m_bUseVSO )
805  {
806    if ( m_uiVSOMode == 4 )
807    {
808#if LGE_VSO_EARLY_SKIP_A0093
809      m_cRendererModel.create( m_cRenModStrParser.getNumOfBaseViews(), m_cRenModStrParser.getNumOfModels(), m_iSourceWidth, g_uiMaxCUHeight , LOG2_DISP_PREC_LUT, 0, m_bVSOEarlySkip );
810#else
811      m_cRendererModel.create( m_cRenModStrParser.getNumOfBaseViews(), m_cRenModStrParser.getNumOfModels(), m_iSourceWidth, g_uiMaxCUHeight , LOG2_DISP_PREC_LUT, 0 );
812#endif
813
814      for ( Int iViewNum = 0; iViewNum < m_iNumberOfViews; iViewNum++ )
815      {
816        for (Int iContent = 0; iContent < 2; iContent++ )
817        {
818          Int iNumOfModels   = m_cRenModStrParser.getNumOfModelsForView(iViewNum, iContent);
819          Bool bUseVSO = (iNumOfModels != 0);
820
821          TEncTop* pcEncTop = ( iContent == 0 ) ? m_acTEncTopList[iViewNum] : m_acTEncDepthTopList[iViewNum];
822          pcEncTop->setUseVSO( bUseVSO );
823          pcEncTop->getRdCost()->setRenModel( bUseVSO ? &m_cRendererModel : NULL );
824
825          for (Int iCurModel = 0; iCurModel < iNumOfModels; iCurModel++ )
826          {
827            Int iModelNum; Int iLeftViewNum; Int iRightViewNum; Int iDump; Int iOrgRefNum; Int iBlendMode;
828
829            m_cRenModStrParser.getSingleModelData  ( iViewNum, iContent, iCurModel, iModelNum, iBlendMode, iLeftViewNum, iRightViewNum, iOrgRefNum, iDump ) ;
830            m_cRendererModel  .createSingleModel   ( iViewNum, iContent, iModelNum, iLeftViewNum, iRightViewNum, (iOrgRefNum != -1), iBlendMode );
831          }
832        }
833      }
834    }
835    else
836    {
837      AOT(true);
838    }
839#if LGE_WVSO_A0119
840    for ( Int iViewNum = 0; iViewNum < m_iNumberOfViews; iViewNum++ )
841    {
842      for (Int iContent = 0; iContent < 2; iContent++ )
843      {
844        TEncTop* pcEncTop = ( iContent == 0 ) ? m_acTEncTopList[iViewNum] : m_acTEncDepthTopList[iViewNum]; 
845        pcEncTop->setUseWVSO  ( m_bUseWVSO );
846        pcEncTop->setVSOWeight( m_iVSOWeight );
847        pcEncTop->setVSDWeight( m_iVSDWeight );
848        pcEncTop->setDWeight  ( m_iDWeight );
849      }
850    }
851#endif
852  }
853#endif
854
855#if HHI_INTERVIEW_SKIP
856  m_cUsedPelsRenderer.init(m_iSourceWidth, m_iSourceHeight, true, 0, LOG2_DISP_PREC_LUT, true, 0, 0, 0, 0, 0, 6, 4, 1, 0, 6 );
857#endif
858
859#if VSP_N
860#if NTT_SUBPEL
861  m_cVSPRendererTop.init(m_iSourceWidth, m_iSourceHeight, true, 0, LOG2_DISP_PREC_LUT, true, 0, 0, 0, 0, 0, 6, 5, 1, 0, 6 );
862#else
863  m_cVSPRendererTop.init(m_iSourceWidth, m_iSourceHeight, true, 0, LOG2_DISP_PREC_LUT, true, 0, 0, 0, 0, 0, 6, 4, 1, 0, 6 );
864#endif
865#endif
866}
867
868Void TAppEncTop::xCreateLib()
869{
870  for(Int iViewIdx=0; iViewIdx<m_iNumberOfViews; iViewIdx++)
871  {
872    m_acTVideoIOYuvInputFileList[iViewIdx]->open( m_pchInputFileList[iViewIdx],     false, m_uiInputBitDepth, m_uiInternalBitDepth );  // read  mode
873    m_acTVideoIOYuvInputFileList[iViewIdx]->skipFrames(m_FrameSkip, m_iSourceWidth - m_aiPad[0], m_iSourceHeight - m_aiPad[1]);
874
875    if (m_pchReconFileList[iViewIdx])
876      m_acTVideoIOYuvReconFileList[iViewIdx]->open(m_pchReconFileList[iViewIdx], true, m_uiOutputBitDepth, m_uiInternalBitDepth);  // write mode
877    m_acTEncTopList[iViewIdx]->create();
878    if( m_bUsingDepthMaps )
879    {
880      m_acTVideoIOYuvDepthInputFileList[iViewIdx]->open( m_pchDepthInputFileList[iViewIdx],     false, m_uiInputBitDepth, m_uiInternalBitDepth );  // read  mode
881      m_acTVideoIOYuvDepthInputFileList[iViewIdx]->skipFrames(m_FrameSkip, m_iSourceWidth - m_aiPad[0], m_iSourceHeight - m_aiPad[1]);
882
883      if (m_pchDepthReconFileList[iViewIdx])
884        m_acTVideoIOYuvDepthReconFileList[iViewIdx]->open(m_pchDepthReconFileList[iViewIdx], true, m_uiOutputBitDepth, m_uiInternalBitDepth);  // write mode
885      m_acTEncDepthTopList[iViewIdx]->create();
886    }
887#if HHI_INTER_VIEW_MOTION_PRED
888    else if( m_uiMultiviewMvRegMode )
889    {
890      m_acTVideoIOYuvDepthInputFileList[iViewIdx]->open( m_pchDepthInputFileList[iViewIdx],     false, m_uiInputBitDepth, m_uiInternalBitDepth );  // read  mode
891      m_acTVideoIOYuvDepthInputFileList[iViewIdx]->skipFrames(m_FrameSkip, m_iSourceWidth, m_iSourceHeight);
892    }
893#endif
894  }
895}
896
897Void TAppEncTop::xDestroyLib()
898{
899  // Video I/O
900  for(Int iViewIdx=0; iViewIdx<m_iNumberOfViews; iViewIdx++)
901  {
902    m_acTVideoIOYuvInputFileList[iViewIdx]->close();
903    m_acTVideoIOYuvReconFileList[iViewIdx]->close();
904    delete m_acTVideoIOYuvInputFileList[iViewIdx] ; 
905    m_acTVideoIOYuvInputFileList[iViewIdx] = NULL;
906    delete m_acTVideoIOYuvReconFileList[iViewIdx] ; 
907    m_acTVideoIOYuvReconFileList[iViewIdx] = NULL;
908    m_acTEncTopList[iViewIdx]->deletePicBuffer();
909    m_acTEncTopList[iViewIdx]->destroy();
910    delete m_acTEncTopList[iViewIdx] ; 
911    m_acTEncTopList[iViewIdx] = NULL;
912    delete m_picYuvRec[iViewIdx] ; 
913    m_picYuvRec[iViewIdx] = NULL;
914
915    if( iViewIdx < Int( m_acTVideoIOYuvDepthInputFileList.size() ) && m_acTVideoIOYuvDepthInputFileList[iViewIdx] )
916    {
917      m_acTVideoIOYuvDepthInputFileList[iViewIdx]->close( );
918      delete m_acTVideoIOYuvDepthInputFileList[iViewIdx];
919      m_acTVideoIOYuvDepthInputFileList[iViewIdx] = NULL;
920    }
921    if( iViewIdx < Int( m_acTVideoIOYuvDepthReconFileList.size() ) && m_acTVideoIOYuvDepthReconFileList[iViewIdx] )
922    {
923      m_acTVideoIOYuvDepthReconFileList[iViewIdx]->close () ;
924      delete m_acTVideoIOYuvDepthReconFileList[iViewIdx];
925      m_acTVideoIOYuvDepthReconFileList[iViewIdx] = NULL;
926    }
927    if( iViewIdx < Int( m_acTEncDepthTopList.size() ) && m_acTEncDepthTopList[iViewIdx] )
928    {
929      m_acTEncDepthTopList[iViewIdx]->deletePicBuffer();
930      m_acTEncDepthTopList[iViewIdx]->destroy();
931      delete m_acTEncDepthTopList[iViewIdx];
932      m_acTEncDepthTopList[iViewIdx] = NULL;
933    }
934    if( iViewIdx < Int( m_picYuvDepthRec.size() ) && m_picYuvDepthRec[iViewIdx] )
935    {
936      delete m_picYuvDepthRec[iViewIdx] ; 
937      m_picYuvDepthRec[iViewIdx] = NULL;
938    }
939  }
940}
941
942Void TAppEncTop::xInitLib()
943{
944  for(Int iViewIdx=0; iViewIdx<m_iNumberOfViews; iViewIdx++)
945  {
946    m_acTEncTopList[iViewIdx]->init( this );
947#if QC_MVHEVC_B0046
948  //set setNumDirectRefLayer
949  Int iNumDirectRef = m_acTEncTopList[iViewIdx]->getSPS()->getNumberOfUsableInterViewRefs();
950  m_acTEncTopList[iViewIdx]->getEncTop()->getVPS()->setNumDirectRefLayer(iNumDirectRef, iViewIdx);
951  for(Int iNumIvRef = 0; iNumIvRef < iNumDirectRef; iNumIvRef ++)
952  {
953    Int iLayerId = m_acTEncTopList[iViewIdx]->getSPS()->getUsableInterViewRef(iNumIvRef);
954    m_acTEncTopList[iViewIdx]->getEncTop()->getVPS()->setDirectRefLayerId( iLayerId + iViewIdx, iViewIdx, iNumIvRef);
955  }
956#endif
957  }
958  for(Int iViewIdx=0; iViewIdx<m_iNumberOfViews; iViewIdx++)
959  {
960    m_acTEncTopList[iViewIdx]->setTEncTopList( &m_acTEncTopList  );
961  }
962  if ( m_bUsingDepthMaps )
963  {
964    for(Int iViewIdx=0; iViewIdx<m_iNumberOfViews; iViewIdx++)
965    {
966      m_acTEncDepthTopList[iViewIdx]->init( this );
967    }
968    for(Int iViewIdx=0; iViewIdx<m_iNumberOfViews; iViewIdx++)
969    {
970      m_acTEncDepthTopList[iViewIdx]->setTEncTopList( &m_acTEncDepthTopList  );
971    }
972  }
973}
974
975// ====================================================================================================================
976// Public member functions
977// ====================================================================================================================
978
979/**
980 - create internal class
981 - initialize internal variable
982 - until the end of input YUV file, call encoding function in TEncTop class
983 - delete allocated buffers
984 - destroy internal class
985 .
986 */
987Void TAppEncTop::encode()
988{
989  fstream bitstreamFile(m_pchBitstreamFile, fstream::binary | fstream::out);
990  if (!bitstreamFile)
991  {
992    fprintf(stderr, "\nfailed to open bitstream file `%s' for writing\n", m_pchBitstreamFile);
993    exit(EXIT_FAILURE);
994  }
995
996  TComPicYuv*       pcPicYuvOrg = new TComPicYuv;
997  TComPicYuv*       pcDepthPicYuvOrg = new TComPicYuv;
998#if !QC_MVHEVC_B0046
999  TComPicYuv*       pcPdmDepthOrg    = new TComPicYuv;
1000#endif
1001  TComPicYuv*       pcPicYuvRec = NULL;
1002  TComPicYuv*       pcDepthPicYuvRec = NULL;
1003 
1004  // initialize internal class & member variables
1005  xInitLibCfg();
1006  xCreateLib();
1007  xInitLib();
1008 
1009  // main encoder loop
1010  Bool  allEos = false;
1011  std::vector<Bool>  eos ;
1012  std::vector<Bool>  depthEos ;
1013  Int maxGopSize = 0;
1014  Int gopSize = 1;
1015 
1016  list<AccessUnit> outputAccessUnits; ///< list of access units to write out.  is populated by the encoding process
1017  maxGopSize = (std::max)(maxGopSize, m_acTEncTopList[0]->getGOPSize());   
1018
1019  for(Int iViewIdx=0; iViewIdx < m_iNumberOfViews; iViewIdx++ )
1020  {
1021    eos.push_back( false );
1022    depthEos.push_back( false );
1023   
1024#if RWTH_SDC_DLT_B0036
1025    if( m_bUsingDepthMaps && m_bUseDLT )
1026      xAnalyzeInputBaseDepth(iViewIdx, m_iIntraPeriod);
1027#endif
1028  }
1029
1030  // allocate original YUV buffer
1031  pcPicYuvOrg->create( m_iSourceWidth, m_iSourceHeight, m_uiMaxCUWidth, m_uiMaxCUHeight, m_uiMaxCUDepth );
1032  pcDepthPicYuvOrg->create( m_iSourceWidth, m_iSourceHeight, m_uiMaxCUWidth, m_uiMaxCUHeight, m_uiMaxCUDepth );
1033
1034#if HHI_INTER_VIEW_MOTION_PRED
1035  if( m_uiMultiviewMvRegMode )
1036  {
1037    pcPdmDepthOrg->create( m_iSourceWidth, m_iSourceHeight, m_uiMaxCUWidth, m_uiMaxCUHeight, m_uiMaxCUDepth );
1038  }
1039#endif
1040
1041  while ( !allEos )
1042  {
1043    for(Int iViewIdx=0; iViewIdx < m_iNumberOfViews; iViewIdx++ )
1044    {
1045      Int frmCnt = 0;
1046      while ( !eos[iViewIdx] && !(frmCnt == gopSize))
1047      {
1048        // get buffers
1049        xGetBuffer(pcPicYuvRec, iViewIdx, false);
1050
1051        // read input YUV file
1052        m_acTVideoIOYuvInputFileList[iViewIdx]->read( pcPicYuvOrg, m_aiPad );
1053     
1054#if HHI_INTER_VIEW_MOTION_PRED
1055        if( m_uiMultiviewMvRegMode && iViewIdx )
1056        {
1057          m_acTVideoIOYuvDepthInputFileList[iViewIdx]->read( pcPdmDepthOrg, m_aiPad, m_bUsingDepthMaps );
1058        }
1059#endif
1060
1061#if HHI_INTER_VIEW_MOTION_PRED
1062        m_acTEncTopList[iViewIdx]->initNewPic( pcPicYuvOrg, ( m_uiMultiviewMvRegMode && iViewIdx ? pcPdmDepthOrg : 0 ) );
1063#else
1064        m_acTEncTopList[iViewIdx]->initNewPic( pcPicYuvOrg );
1065#endif
1066
1067        // increase number of received frames
1068        m_frameRcvd[iViewIdx]++;
1069        frmCnt++;
1070        // check end of file
1071        eos[iViewIdx] = ( m_acTVideoIOYuvInputFileList[iViewIdx]->isEof() == 1 ?   true : false  );
1072        eos[iViewIdx] = ( m_frameRcvd[iViewIdx] == m_iFrameToBeEncoded ?    true : eos[iViewIdx]   );
1073        allEos = allEos|eos[iViewIdx] ; 
1074      }
1075      if( m_bUsingDepthMaps )
1076      {
1077        Int frmCntDepth = 0;
1078        while ( !depthEos[iViewIdx] && !(frmCntDepth == gopSize))
1079        {
1080          // get buffers
1081          xGetBuffer(pcDepthPicYuvRec, iViewIdx, true);
1082
1083          // read input YUV file
1084          m_acTVideoIOYuvDepthInputFileList[iViewIdx]->read( pcDepthPicYuvOrg, m_aiPad );
1085
1086          m_acTEncDepthTopList[iViewIdx]->initNewPic( pcDepthPicYuvOrg );
1087
1088          // increase number of received frames
1089          m_depthFrameRcvd[iViewIdx]++;
1090          frmCntDepth++;
1091          // check end of file
1092          depthEos[iViewIdx] = ( m_acTVideoIOYuvDepthInputFileList[iViewIdx]->isEof() == 1 ?   true : false  );
1093          depthEos[iViewIdx] = ( m_depthFrameRcvd[iViewIdx] == m_iFrameToBeEncoded ?    true : depthEos[iViewIdx]   );
1094          allEos = allEos|depthEos[iViewIdx] ; 
1095        }
1096      }
1097    }
1098    for ( Int gopId=0; gopId < gopSize; gopId++ )
1099    {
1100      Int  iNumEncoded = 0;
1101#if !QC_MVHEVC_B0046
1102      UInt iNextPoc = m_acTEncTopList[0] -> getFrameId( gopId );
1103      if ( iNextPoc < m_iFrameToBeEncoded )
1104      {
1105        m_cCameraData.update( iNextPoc );
1106      }
1107#endif
1108
1109#if FLEX_CODING_ORDER_M23723
1110      if (m_b3DVFlexOrder)
1111      {
1112        Int  iNumDepthEncoded = 0;
1113        iNumEncoded = 0;
1114        Int i=0;
1115        Int iViewIdx=0;
1116        Int iNumberofDepthViews = m_bUsingDepthMaps?m_iNumberOfViews:0;
1117        for (Int j=0; j < (m_iNumberOfViews+ iNumberofDepthViews); j++ )
1118        {
1119          if (m_pchMVCJointCodingOrder[i]=='T')
1120          {
1121
1122            i++;
1123            assert(isdigit(m_pchMVCJointCodingOrder[i]));
1124            iViewIdx = (Int)(m_pchMVCJointCodingOrder[i]-'0');
1125
1126#if VSP_SLICE_HEADER && !VSP_CFG
1127            if( m_acTEncTopList[iViewIdx]->getUseVSP() ) m_acTEncTopList[iViewIdx]->setUseVSP( (gopId%VSP_FRAME_INTERVAL==0) );
1128#endif
1129
1130#if VSP_N
1131#if VSP_SLICE_HEADER
1132            if( m_acTEncTopList[iViewIdx]->getUseVSP() )
1133#endif
1134            if( m_bUsingDepthMaps )
1135            {
1136              // Forward Warping
1137              xStoreVSPInBuffer( m_acTEncTopList[iViewIdx]->getVSPBuf(), m_acTEncTopList[iViewIdx]->getVSPAvailBuf(), iViewIdx, false, gopId );
1138            }
1139#endif
1140
1141            m_acTEncTopList[iViewIdx]->encode( eos[iViewIdx], pcPicYuvOrg, *m_picYuvRec[iViewIdx], outputAccessUnits, iNumEncoded, gopId );
1142            xWriteOutput(bitstreamFile, iNumEncoded, outputAccessUnits, iViewIdx, false);
1143            outputAccessUnits.clear();
1144            i++;
1145          }
1146          else if ( m_pchMVCJointCodingOrder[i] == 'D')
1147          {
1148
1149            i++;
1150            if( m_bUsingDepthMaps )
1151            {
1152              assert(isdigit(m_pchMVCJointCodingOrder[i]));
1153              iViewIdx = (Int)(m_pchMVCJointCodingOrder[i]-'0');
1154#if SAIT_VSO_EST_A0033
1155              if( m_bUseVSO && iNextPoc < m_iFrameToBeEncoded )
1156              {
1157                m_cCameraData.xSetDispCoeff( iNextPoc, iViewIdx );
1158                m_acTEncDepthTopList[iViewIdx]->setDispCoeff( m_cCameraData.getDispCoeff() );
1159              }
1160#endif
1161
1162#if VSP_SLICE_HEADER && !VSP_CFG
1163              if( m_acTEncDepthTopList[iViewIdx]->getUseVSP() ) m_acTEncDepthTopList[iViewIdx]->setUseVSP( (gopId%VSP_FRAME_INTERVAL==0) );
1164#endif
1165
1166#if VSP_N
1167#if VSP_SLICE_HEADER
1168              if( m_acTEncDepthTopList[iViewIdx]->getUseVSP() )
1169              if( !m_acTEncDepthTopList[iViewIdx]->getVSPDepthDisable() )
1170#endif
1171                xStoreVSPInBuffer( m_acTEncDepthTopList[iViewIdx]->getVSPBuf(), m_acTEncDepthTopList[iViewIdx]->getVSPAvailBuf(), iViewIdx, true, gopId );
1172#endif
1173
1174              m_acTEncDepthTopList[iViewIdx]->encode( depthEos[iViewIdx], pcDepthPicYuvOrg, *m_picYuvDepthRec[iViewIdx], outputAccessUnits, iNumDepthEncoded, gopId );
1175              xWriteOutput(bitstreamFile, iNumDepthEncoded, outputAccessUnits, iViewIdx, true);
1176              outputAccessUnits.clear();
1177              i++;
1178            }
1179          }
1180        }
1181      }
1182      else
1183      {
1184
1185#endif
1186      for(Int iViewIdx=0; iViewIdx < m_iNumberOfViews; iViewIdx++ )
1187      {
1188#if SAIT_VSO_EST_A0033
1189        if( m_bUseVSO && iNextPoc < m_iFrameToBeEncoded )
1190        {
1191          m_cCameraData.xSetDispCoeff( iNextPoc, iViewIdx );
1192          m_acTEncDepthTopList[iViewIdx]->setDispCoeff( m_cCameraData.getDispCoeff() );
1193        }
1194#endif
1195        iNumEncoded = 0;
1196
1197#if VSP_SLICE_HEADER && !VSP_CFG
1198        if( m_acTEncTopList     [iViewIdx]->getUseVSP() ) m_acTEncTopList     [iViewIdx]->setUseVSP( (gopId%VSP_FRAME_INTERVAL==0) );
1199        if( m_acTEncDepthTopList[iViewIdx]->getUseVSP() ) m_acTEncDepthTopList[iViewIdx]->setUseVSP( (gopId%VSP_FRAME_INTERVAL==0) );
1200#endif
1201
1202#if VSP_N
1203#if VSP_SLICE_HEADER
1204        if( m_acTEncTopList[iViewIdx]->getUseVSP() )
1205#endif
1206        if( m_bUsingDepthMaps )
1207        {
1208          // Forward Warping
1209          xStoreVSPInBuffer(m_acTEncTopList[iViewIdx]->getVSPBuf(), m_acTEncTopList[iViewIdx]->getVSPAvailBuf(), iViewIdx, false, gopId);
1210        }
1211#endif
1212        // call encoding function for one frame
1213        m_acTEncTopList[iViewIdx]->encode( eos[iViewIdx], pcPicYuvOrg, *m_picYuvRec[iViewIdx], outputAccessUnits, iNumEncoded, gopId );
1214        xWriteOutput(bitstreamFile, iNumEncoded, outputAccessUnits, iViewIdx, false);
1215        outputAccessUnits.clear();
1216        if( m_bUsingDepthMaps )
1217        {
1218          Int  iNumDepthEncoded = 0;
1219#if VSP_N
1220#if VSP_SLICE_HEADER
1221          if( m_acTEncDepthTopList[iViewIdx]->getUseVSP() )
1222          if( !m_acTEncDepthTopList[iViewIdx]->getVSPDepthDisable() )
1223#endif
1224            xStoreVSPInBuffer(m_acTEncDepthTopList[iViewIdx]->getVSPBuf(), m_acTEncDepthTopList[iViewIdx]->getVSPAvailBuf(), iViewIdx, true, gopId);
1225#endif
1226          // call encoding function for one depth frame
1227          m_acTEncDepthTopList[iViewIdx]->encode( depthEos[iViewIdx], pcDepthPicYuvOrg, *m_picYuvDepthRec[iViewIdx], outputAccessUnits, iNumDepthEncoded, gopId );
1228          xWriteOutput(bitstreamFile, iNumDepthEncoded, outputAccessUnits, iViewIdx, true);
1229          outputAccessUnits.clear();
1230        }
1231      }
1232 
1233#if FLEX_CODING_ORDER_M23723
1234      }
1235#endif
1236
1237#if HHI_INTERVIEW_SKIP || HHI_INTER_VIEW_MOTION_PRED || HHI_INTER_VIEW_RESIDUAL_PRED
1238      for( Int iViewIdx = 0; iViewIdx < m_iNumberOfViews; iViewIdx++ )
1239      {
1240        if( iViewIdx < (Int)m_acTEncTopList.size() && m_acTEncTopList[iViewIdx] )
1241        {
1242          m_acTEncTopList[iViewIdx]->deleteExtraPicBuffers( m_acTEncTopList[iViewIdx]->getGOPEncoder()->getPocLastCoded() );
1243        }
1244        if( iViewIdx < (Int)m_acTEncDepthTopList.size() && m_acTEncDepthTopList[iViewIdx] )
1245        {
1246          m_acTEncDepthTopList[iViewIdx]->deleteExtraPicBuffers( m_acTEncTopList[iViewIdx]->getGOPEncoder()->getPocLastCoded() );
1247        }
1248      }
1249#endif
1250      for(Int iViewIdx=0; iViewIdx < m_iNumberOfViews; iViewIdx++ )
1251      {
1252        m_acTEncTopList[iViewIdx]->compressMotion( m_acTEncTopList[iViewIdx]->getGOPEncoder()->getPocLastCoded() );
1253        if( m_bUsingDepthMaps )
1254        {
1255          m_acTEncDepthTopList[iViewIdx]->compressMotion( m_acTEncDepthTopList[iViewIdx]->getGOPEncoder()->getPocLastCoded() );
1256        }
1257      }
1258    }
1259    gopSize = maxGopSize;
1260  }
1261  // delete original YUV buffer
1262  pcPicYuvOrg->destroy();
1263  delete pcPicYuvOrg;
1264  pcPicYuvOrg = NULL;
1265  pcDepthPicYuvOrg->destroy();
1266  delete pcDepthPicYuvOrg;
1267  pcDepthPicYuvOrg = NULL;
1268 
1269#if !QC_MVHEVC_B0046
1270#if FIX_DEL_NULLPTR
1271  if ( pcPdmDepthOrg != NULL && m_uiMultiviewMvRegMode )
1272#else
1273  if ( pcPdmDepthOrg != NULL )
1274#endif
1275  {
1276    pcPdmDepthOrg->destroy();
1277    delete pcPdmDepthOrg;     
1278    pcPdmDepthOrg = NULL; 
1279  };
1280#endif
1281 
1282  for(Int iViewIdx=0; iViewIdx < m_iNumberOfViews; iViewIdx++ )
1283  {
1284    m_acTEncTopList[iViewIdx]->printOutSummary(m_acTEncTopList[iViewIdx]->getNumAllPicCoded());
1285    if ( m_bUsingDepthMaps )
1286    {
1287      m_acTEncDepthTopList[iViewIdx]->printOutSummary(m_acTEncDepthTopList[iViewIdx]->getNumAllPicCoded());
1288    }
1289  }
1290
1291  // delete buffers & classes
1292  xDeleteBuffer();
1293  xDestroyLib();
1294
1295  return;
1296}
1297
1298TEncTop*  TAppEncTop::getTEncTop( Int viewId, Bool isDepth )   
1299{ 
1300  if ( isDepth ) 
1301  {
1302    return m_acTEncDepthTopList[viewId]; 
1303  } 
1304  else
1305  { 
1306    return m_acTEncTopList[viewId]; 
1307  } 
1308}
1309
1310
1311// ====================================================================================================================
1312// Protected member functions
1313// ====================================================================================================================
1314
1315/**
1316 - application has picture buffer list with size of GOP
1317 - picture buffer list acts as ring buffer
1318 - end of the list has the latest picture
1319 .
1320 */
1321Void TAppEncTop::xGetBuffer( TComPicYuv*& rpcPicYuvRec, Int iViewIdx, Bool isDepth)
1322{
1323  assert( m_iGOPSize > 0 );
1324 
1325  if( !isDepth )
1326  {
1327    if ( m_picYuvRec[iViewIdx]->size() == (UInt)m_iGOPSize )
1328    {
1329      rpcPicYuvRec = m_picYuvRec[iViewIdx]->popFront();
1330    }
1331    else
1332    {
1333      rpcPicYuvRec = new TComPicYuv; 
1334      rpcPicYuvRec->create( m_iSourceWidth, m_iSourceHeight, m_uiMaxCUWidth, m_uiMaxCUHeight, m_uiMaxCUDepth );
1335    }
1336    m_picYuvRec[iViewIdx]->pushBack( rpcPicYuvRec );
1337  }
1338  else
1339  {
1340    if ( m_picYuvDepthRec[iViewIdx]->size() == (UInt)m_iGOPSize )
1341    {
1342      rpcPicYuvRec = m_picYuvDepthRec[iViewIdx]->popFront();
1343    }
1344    else
1345    {
1346      rpcPicYuvRec = new TComPicYuv; 
1347      rpcPicYuvRec->create( m_iSourceWidth, m_iSourceHeight, m_uiMaxCUWidth, m_uiMaxCUHeight, m_uiMaxCUDepth );
1348    }
1349    m_picYuvDepthRec[iViewIdx]->pushBack( rpcPicYuvRec );
1350  }
1351}
1352
1353Void TAppEncTop::xDeleteBuffer( )
1354{
1355  for(Int iViewIdx=0; iViewIdx<m_picYuvRec.size(); iViewIdx++)
1356  {
1357    if(m_picYuvRec[iViewIdx])
1358    {
1359      TComList<TComPicYuv*>::iterator iterPicYuvRec  = m_picYuvRec[iViewIdx]->begin();
1360      Int iSize = Int( m_picYuvRec[iViewIdx]->size() );
1361      for ( Int i = 0; i < iSize; i++ )
1362      {
1363        TComPicYuv*  pcPicYuvRec  = *(iterPicYuvRec++);
1364        if(pcPicYuvRec)
1365        {
1366          pcPicYuvRec->destroy();
1367          delete pcPicYuvRec; 
1368          pcPicYuvRec = NULL;
1369        }
1370      }
1371    } 
1372  }
1373  for(Int iViewIdx=0; iViewIdx<m_picYuvDepthRec.size(); iViewIdx++)
1374  {
1375    if(m_picYuvDepthRec[iViewIdx])
1376    {
1377      TComList<TComPicYuv*>::iterator iterPicYuvRec  = m_picYuvDepthRec[iViewIdx]->begin();
1378      Int iSize = Int( m_picYuvDepthRec[iViewIdx]->size() );
1379      for ( Int i = 0; i < iSize; i++ )
1380      {
1381        TComPicYuv*  pcPicYuvRec  = *(iterPicYuvRec++);
1382        if(pcPicYuvRec)
1383        {
1384          pcPicYuvRec->destroy();
1385          delete pcPicYuvRec; 
1386          pcPicYuvRec = NULL;
1387        }
1388      } 
1389    }
1390  }
1391}
1392
1393/** \param iNumEncoded  number of encoded frames
1394 */
1395Void TAppEncTop::xWriteOutput(std::ostream& bitstreamFile, Int iNumEncoded, std::list<AccessUnit>& accessUnits, Int iViewIdx, Bool isDepth )
1396{
1397  Int i;
1398 
1399  if( iNumEncoded > 0 )
1400  {
1401    TComList<TComPicYuv*>::iterator iterPicYuvRec = !isDepth ? m_picYuvRec[iViewIdx]->end() : m_picYuvDepthRec[iViewIdx]->end();
1402 
1403    for ( i = 0; i < iNumEncoded; i++ )
1404    {
1405      --iterPicYuvRec;
1406    }
1407 
1408    for ( i = 0; i < iNumEncoded; i++ )
1409    {
1410      TComPicYuv*  pcPicYuvRec  = *(iterPicYuvRec++);
1411      if( !isDepth )
1412      {
1413        if (m_pchReconFileList[iViewIdx])
1414        {
1415#if PIC_CROPPING
1416          m_acTVideoIOYuvReconFileList[iViewIdx]->write( pcPicYuvRec, m_cropLeft, m_cropRight, m_cropTop, m_cropBottom );
1417#else
1418          m_acTVideoIOYuvReconFileList[iViewIdx]->write( pcPicYuvRec, m_aiPad );
1419#endif
1420        }
1421      }
1422      else
1423      {
1424        if (m_pchDepthReconFileList[iViewIdx])
1425        {
1426#if PIC_CROPPING
1427          m_acTVideoIOYuvDepthReconFileList[iViewIdx]->write( pcPicYuvRec, m_cropLeft, m_cropRight, m_cropTop, m_cropBottom );
1428#else
1429          m_acTVideoIOYuvDepthReconFileList[iViewIdx]->write( pcPicYuvRec, m_aiPad );
1430#endif
1431        }
1432      }
1433    }
1434  }
1435  if( ! accessUnits.empty() )
1436  {
1437    list<AccessUnit>::iterator aUIter;
1438    for( aUIter = accessUnits.begin(); aUIter != accessUnits.end(); aUIter++ )
1439    {
1440      const vector<unsigned>& stats = writeAnnexB(bitstreamFile, *aUIter);
1441      rateStatsAccum(*aUIter, stats);
1442    }
1443  }
1444}
1445
1446
1447TComPicYuv* TAppEncTop::xGetPicYuvFromView( Int iViewIdx, Int iPoc, Bool bDepth, Bool bRecon )
1448{
1449  TComPic*    pcPic = xGetPicFromView( iViewIdx, iPoc, bDepth);
1450  TComPicYuv* pcPicYuv = NULL;
1451
1452  if (pcPic != NULL)
1453  {
1454    if( bRecon )
1455    {
1456      if ( pcPic->getReconMark() )
1457      {
1458        pcPicYuv = pcPic->getPicYuvRec();
1459      }
1460    }
1461    else
1462    {
1463      pcPicYuv = pcPic->getPicYuvOrg();
1464    }
1465  };
1466
1467  return pcPicYuv;
1468};
1469
1470/**
1471 *
1472 */
1473void TAppEncTop::rateStatsAccum(const AccessUnit& au, const std::vector<unsigned>& annexBsizes)
1474{
1475  AccessUnit::const_iterator it_au = au.begin();
1476  vector<unsigned>::const_iterator it_stats = annexBsizes.begin();
1477
1478  for (; it_au != au.end(); it_au++, it_stats++)
1479  {
1480    switch ((*it_au)->m_nalUnitType)
1481    {
1482    case NAL_UNIT_CODED_SLICE:
1483#if H0566_TLA
1484#if !QC_REM_IDV_B0046
1485    case NAL_UNIT_CODED_SLICE_IDV:
1486#endif
1487    case NAL_UNIT_CODED_SLICE_TLA:
1488    case NAL_UNIT_CODED_SLICE_CRA:
1489#else
1490    case NAL_UNIT_CODED_SLICE_DATAPART_A:
1491    case NAL_UNIT_CODED_SLICE_DATAPART_B:
1492    case NAL_UNIT_CODED_SLICE_CDR:
1493#endif
1494    case NAL_UNIT_CODED_SLICE_IDR:
1495    case NAL_UNIT_SPS:
1496    case NAL_UNIT_PPS:
1497#if VIDYO_VPS_INTEGRATION
1498    case NAL_UNIT_VPS:
1499#endif
1500      m_essentialBytes += *it_stats;
1501      break;
1502    default:
1503      break;
1504    }
1505
1506    m_totalBytes += *it_stats;
1507  }
1508}
1509
1510#if HHI_INTERVIEW_SKIP
1511Void TAppEncTop::getUsedPelsMap( Int iViewIdx, Int iPoc, TComPicYuv* pcPicYuvUsedSplsMap )
1512{
1513  AOT( iViewIdx <= 0);
1514  AOT( iViewIdx >= m_iNumberOfViews );
1515  AOF( m_cCameraData.getCurFrameId() == iPoc );
1516  Int iViewSIdx      = m_cCameraData.getBaseId2SortedId()[iViewIdx];
1517  Int iFirstViewSIdx = m_cCameraData.getBaseId2SortedId()[0];
1518
1519  AOT( iViewSIdx == iFirstViewSIdx );
1520
1521  Bool bFirstIsLeft = (iFirstViewSIdx < iViewSIdx);
1522
1523  m_cUsedPelsRenderer.setShiftLUTs(
1524      m_cCameraData.getBaseViewShiftLUTD()[0][iViewIdx],
1525      m_cCameraData.getBaseViewShiftLUTI()[0][iViewIdx],
1526      m_cCameraData.getBaseViewShiftLUTI()[0][iViewIdx],
1527      m_cCameraData.getBaseViewShiftLUTD()[0][iViewIdx],
1528      m_cCameraData.getBaseViewShiftLUTI()[0][iViewIdx],
1529      m_cCameraData.getBaseViewShiftLUTI()[0][iViewIdx],
1530      -1
1531      );
1532
1533  TComPicYuv* pcPicYuvDepth = xGetPicYuvFromView(0, iPoc, true, true );
1534  AOF( pcPicYuvDepth);
1535
1536  m_cUsedPelsRenderer.getUsedSamplesMap( pcPicYuvDepth, pcPicYuvUsedSplsMap, bFirstIsLeft );
1537}
1538#endif
1539#if HHI_VSO
1540Void TAppEncTop::setupRenModel( Int iPoc, Int iEncViewIdx, Int iEncContent, Int iHorOffset )
1541{
1542  m_cRendererModel.setupPart( iHorOffset, Min( g_uiMaxCUHeight, m_iSourceHeight - iHorOffset ) ); 
1543  Int iEncViewSIdx = m_cCameraData.getBaseId2SortedId()[ iEncViewIdx ];
1544
1545  // setup base views
1546  Int iNumOfBV = m_cRenModStrParser.getNumOfBaseViewsForView( iEncViewSIdx, iEncContent );
1547
1548  for (Int iCurView = 0; iCurView < iNumOfBV; iCurView++ )
1549  {
1550    Int iBaseViewSIdx;
1551    Int iVideoDistMode;
1552    Int iDepthDistMode;
1553
1554    m_cRenModStrParser.getBaseViewData( iEncViewSIdx, iEncContent, iCurView, iBaseViewSIdx, iVideoDistMode, iDepthDistMode );
1555
1556    AOT( iVideoDistMode < 0 || iVideoDistMode > 2 );
1557
1558    Int iBaseViewIdx = m_cCameraData.getBaseSortedId2Id()[ iBaseViewSIdx ];
1559
1560    TComPicYuv* pcPicYuvVideoRec  = xGetPicYuvFromView( iBaseViewIdx, iPoc, false, true  );
1561    TComPicYuv* pcPicYuvDepthRec  = xGetPicYuvFromView( iBaseViewIdx, iPoc, true , true  );
1562    TComPicYuv* pcPicYuvVideoOrg  = xGetPicYuvFromView( iBaseViewIdx, iPoc, false, false );
1563    TComPicYuv* pcPicYuvDepthOrg  = xGetPicYuvFromView( iBaseViewIdx, iPoc, true , false );
1564
1565    TComPicYuv* pcPicYuvVideoRef  = ( iVideoDistMode == 2 ) ? pcPicYuvVideoOrg  : NULL;
1566    TComPicYuv* pcPicYuvDepthRef  = ( iDepthDistMode == 2 ) ? pcPicYuvDepthOrg  : NULL;
1567
1568    TComPicYuv* pcPicYuvVideoTest = ( iVideoDistMode == 0 ) ? pcPicYuvVideoOrg  : pcPicYuvVideoRec;
1569    TComPicYuv* pcPicYuvDepthTest = ( iDepthDistMode == 0 ) ? pcPicYuvDepthOrg  : pcPicYuvDepthRec;
1570
1571    AOT( (iVideoDistMode == 2) != (pcPicYuvVideoRef != NULL) );
1572    AOT( (iDepthDistMode == 2) != (pcPicYuvDepthRef != NULL) );
1573    AOT( pcPicYuvDepthTest == NULL );
1574    AOT( pcPicYuvVideoTest == NULL );
1575
1576    m_cRendererModel.setBaseView( iBaseViewSIdx, pcPicYuvVideoTest, pcPicYuvDepthTest, pcPicYuvVideoRef, pcPicYuvDepthRef );
1577  }
1578
1579  m_cRendererModel.setErrorMode( iEncViewSIdx, iEncContent, 0 );
1580  // setup virtual views
1581  Int iNumOfSV  = m_cRenModStrParser.getNumOfModelsForView( iEncViewSIdx, iEncContent );
1582  for (Int iCurView = 0; iCurView < iNumOfSV; iCurView++ )
1583  {
1584    Int iOrgRefBaseViewSIdx;
1585    Int iLeftBaseViewSIdx;
1586    Int iRightBaseViewSIdx;
1587    Int iSynthViewRelNum;
1588    Int iModelNum;
1589    Int iBlendMode;
1590    m_cRenModStrParser.getSingleModelData(iEncViewSIdx, iEncContent, iCurView, iModelNum, iBlendMode,iLeftBaseViewSIdx, iRightBaseViewSIdx, iOrgRefBaseViewSIdx, iSynthViewRelNum );
1591
1592    Int iLeftBaseViewIdx    = -1;
1593    Int iRightBaseViewIdx   = -1;
1594
1595    TComPicYuv* pcPicYuvOrgRef  = NULL;
1596    Int**      ppiShiftLUTLeft  = NULL;
1597    Int**      ppiShiftLUTRight = NULL;
1598    Int**      ppiBaseShiftLUTLeft  = NULL;
1599    Int**      ppiBaseShiftLUTRight = NULL;
1600
1601
1602    Int        iDistToLeft      = -1;
1603
1604    Int iSynthViewIdx = m_cCameraData.synthRelNum2Idx( iSynthViewRelNum );
1605
1606    if ( iLeftBaseViewSIdx != -1 )
1607    {
1608      iLeftBaseViewIdx   = m_cCameraData.getBaseSortedId2Id()   [ iLeftBaseViewSIdx ];
1609      ppiShiftLUTLeft    = m_cCameraData.getSynthViewShiftLUTI()[ iLeftBaseViewIdx  ][ iSynthViewIdx  ];
1610    }
1611
1612    if ( iRightBaseViewSIdx != -1 )
1613    {
1614      iRightBaseViewIdx  = m_cCameraData.getBaseSortedId2Id()   [iRightBaseViewSIdx ];
1615      ppiShiftLUTRight   = m_cCameraData.getSynthViewShiftLUTI()[ iRightBaseViewIdx ][ iSynthViewIdx ];
1616    }
1617
1618    if ( iRightBaseViewSIdx != -1 && iLeftBaseViewSIdx != -1 )
1619    {
1620      iDistToLeft    = m_cCameraData.getRelDistLeft(  iSynthViewIdx , iLeftBaseViewIdx, iRightBaseViewIdx);
1621      ppiBaseShiftLUTLeft  = m_cCameraData.getBaseViewShiftLUTI() [ iLeftBaseViewIdx  ][ iRightBaseViewIdx ];
1622      ppiBaseShiftLUTRight = m_cCameraData.getBaseViewShiftLUTI() [ iRightBaseViewIdx ][ iLeftBaseViewIdx  ];
1623
1624    }
1625
1626    if ( iOrgRefBaseViewSIdx != -1 )
1627    {
1628      pcPicYuvOrgRef = xGetPicYuvFromView( m_cCameraData.getBaseSortedId2Id()[ iOrgRefBaseViewSIdx ] , iPoc, false, false );
1629      AOF ( pcPicYuvOrgRef );
1630    }
1631
1632    m_cRendererModel.setSingleModel( iModelNum, ppiShiftLUTLeft, ppiBaseShiftLUTLeft, ppiShiftLUTRight, ppiBaseShiftLUTRight, iDistToLeft, pcPicYuvOrgRef );
1633  }
1634}
1635#endif
1636
1637
1638
1639/*
1640void TAppEncTop::printRateSummary()
1641{
1642  double time = (double) m_iFrameRcvd / m_iFrameRate;
1643  printf("Bytes written to file: %u (%.3f kbps)\n", m_totalBytes, 0.008 * m_totalBytes / time);
1644#if VERBOSE_RATE
1645  printf("Bytes for SPS/PPS/Slice (Incl. Annex B): %u (%.3f kbps)\n", m_essentialBytes, 0.008 * m_essentialBytes / time);
1646#endif
1647}
1648*/
1649
1650std::vector<TComPic*> TAppEncTop::getInterViewRefPics( Int viewId, Int poc, Bool isDepth, TComSPS* sps )
1651{
1652  std::vector<TComPic*> apcRefPics( sps->getNumberOfUsableInterViewRefs(), (TComPic*)NULL );
1653  for( Int k = 0; k < sps->getNumberOfUsableInterViewRefs(); k++ )
1654  {
1655    TComPic* pcRefPic = xGetPicFromView( sps->getUsableInterViewRef( k ) + viewId, poc, isDepth );
1656    assert( pcRefPic != NULL );
1657    apcRefPics[k] = pcRefPic;
1658  }
1659  return apcRefPics;
1660}
1661
1662TComPic* TAppEncTop::xGetPicFromView( Int viewIdx, Int poc, Bool isDepth )
1663{
1664  assert( ( viewIdx >= 0 ) && ( viewIdx < m_iNumberOfViews ) );
1665
1666  TComList<TComPic*>* apcListPic = (isDepth ?  m_acTEncDepthTopList[viewIdx] : m_acTEncTopList[viewIdx])->getListPic() ;
1667
1668  TComPic* pcPic = NULL;
1669  for(TComList<TComPic*>::iterator it=apcListPic->begin(); it!=apcListPic->end(); it++)
1670  {
1671    if( (*it)->getPOC() == poc )
1672    {
1673      pcPic = *it ;
1674      break ;
1675    }
1676  }
1677
1678  return pcPic;
1679};
1680 
1681#if RWTH_SDC_DLT_B0036
1682Void TAppEncTop::xAnalyzeInputBaseDepth(Int iViewIdx, UInt uiNumFrames)
1683{
1684  TComPicYuv*       pcDepthPicYuvOrg = new TComPicYuv;
1685  // allocate original YUV buffer
1686  pcDepthPicYuvOrg->create( m_iSourceWidth, m_iSourceHeight, m_uiMaxCUWidth, m_uiMaxCUHeight, m_uiMaxCUDepth );
1687 
1688  TVideoIOYuv* depthVideoFile = new TVideoIOYuv;
1689 
1690  UInt uiMaxDepthValue = g_uiIBDI_MAX;
1691 
1692  Bool abValidDepths[256];
1693 
1694  depthVideoFile->open( m_pchDepthInputFileList[iViewIdx], false, m_uiInputBitDepth, m_uiInternalBitDepth );  // read  mode
1695 
1696  // initialize boolean array
1697  for(Int p=0; p<=uiMaxDepthValue; p++)
1698    abValidDepths[p] = false;
1699 
1700  Int iHeight   = pcDepthPicYuvOrg->getHeight();
1701  Int iWidth    = pcDepthPicYuvOrg->getWidth();
1702  Int iStride   = pcDepthPicYuvOrg->getStride();
1703 
1704  Pel* pInDM    = pcDepthPicYuvOrg->getLumaAddr();
1705 
1706  for(Int uiFrame=0; uiFrame < uiNumFrames; uiFrame++ )
1707  {
1708    depthVideoFile->read( pcDepthPicYuvOrg, m_aiPad, false );
1709   
1710    // check all pixel values
1711    for (Int i=0; i<iHeight; i++)
1712    {
1713      Int rowOffset = i*iStride;
1714     
1715      for (Int j=0; j<iWidth; j++)
1716      {
1717        Pel depthValue = pInDM[rowOffset+j];
1718        abValidDepths[depthValue] = true;
1719      }
1720    }
1721  }
1722 
1723  depthVideoFile->close();
1724 
1725  pcDepthPicYuvOrg->destroy();
1726  delete pcDepthPicYuvOrg;
1727 
1728  // convert boolean array to idx2Depth LUT
1729  UInt* auiIdx2DepthValue = (UInt*) calloc(uiMaxDepthValue, sizeof(UInt));
1730  UInt uiNumDepthValues = 0;
1731  for(UInt p=0; p<=uiMaxDepthValue; p++)
1732  {
1733    if( abValidDepths[p] == true)
1734    {
1735      auiIdx2DepthValue[uiNumDepthValues++] = p;
1736    }
1737  }
1738 
1739  if( uiNumFrames == 0 || ceil(Log2(uiNumDepthValues)) == ceil(Log2(g_uiIBDI_MAX)) )
1740  {
1741    // don't use DLT
1742    m_acTEncDepthTopList[iViewIdx]->setUseDLT(false);
1743    m_acTEncDepthTopList[iViewIdx]->getSPS()->setUseDLT(false);
1744  }
1745 
1746  // assign LUT
1747  if( m_acTEncDepthTopList[iViewIdx]->getUseDLT() )
1748    m_acTEncDepthTopList[iViewIdx]->getSPS()->setDepthLUTs(auiIdx2DepthValue, uiNumDepthValues);
1749  else
1750    m_acTEncDepthTopList[iViewIdx]->getSPS()->setDepthLUTs();
1751 
1752  // free temporary memory
1753  free(auiIdx2DepthValue);
1754}
1755#endif
1756
1757#if VSP_N
1758Void TAppEncTop::xStoreVSPInBuffer(TComPic* pcPicVSP, TComPic* pcPicAvail, Int iCodedViewIdx, Bool bDepth, Int gopId)
1759{
1760  //first view does not have VSP
1761  if((iCodedViewIdx == 0))
1762    return;
1763
1764  AOT( iCodedViewIdx <= 0);
1765  AOT( iCodedViewIdx >= m_iNumberOfViews );
1766 
1767  Int iCurPoc;
1768  //getting currrent POC and checking if the frame will be coded
1769  if(bDepth)
1770  {
1771    iCurPoc = m_acTEncDepthTopList[iCodedViewIdx]->getFrameId(gopId);
1772    if(iCurPoc>=m_acTEncDepthTopList[iCodedViewIdx]->getFrameToBeEncoded())
1773      return;
1774    //if(!(m_acTEncDepthTopList[iCodedViewIdx]->currentPocWillBeCoded()))
1775    //  return;
1776  }
1777  else
1778  {
1779    iCurPoc = m_acTEncTopList[iCodedViewIdx]->getFrameId(gopId);
1780    if(iCurPoc>=m_acTEncTopList[iCodedViewIdx]->getFrameToBeEncoded())
1781      return;
1782    //if(!(m_acTEncTopList[iCodedViewIdx]->currentPocWillBeCoded()))
1783    //  return;
1784  }
1785  pcPicVSP->getSlice(0)->setPOC( iCurPoc );
1786  pcPicVSP->getSlice(0)->setViewId( iCodedViewIdx );
1787
1788  Int iNeighborViewId = 0;  //iCodedViewIdx + m_GOPListsMvc[iCodedViewIdx][gopId].m_VSPRefPics[0];
1789  Bool bRenderFromLeft;
1790  //check if the neighboring view is situated to the left of the current view
1791  bRenderFromLeft = ((m_cCameraData.getBaseSortedId2Id()[iCodedViewIdx]-m_cCameraData.getBaseSortedId2Id()[iNeighborViewId])>0);
1792  //pointers to buffers   
1793  TComPicYuv* pcPicYuvVideo = xGetPicYuvFromView(iNeighborViewId, iCurPoc, bDepth, true );
1794  TComPicYuv* pcPicYuvDepth = xGetPicYuvFromView(iNeighborViewId, iCurPoc, true, true );
1795  TComPicYuv* pcPicYuvVSP   = pcPicVSP->getPicYuvRec();
1796  TComPicYuv* pcPicYuvAvail = pcPicAvail->getPicYuvRec();
1797  //verifying buffers
1798  AOF(pcPicYuvVideo);
1799  AOF(pcPicYuvDepth);
1800  AOF(pcPicYuvVSP);
1801  AOF(pcPicYuvAvail);
1802 
1803  TComPic* pcPic = getPicFromView( iCodedViewIdx, iCurPoc, bDepth );
1804  pcPic->setPicYuvSynth( pcPicYuvVSP );
1805  pcPic->setPicYuvAvail( pcPicYuvAvail );
1806
1807  //setting look-up table
1808#if 0
1809  m_cVSPRendererTop.setShiftLUTs(
1810      m_cCameraData.getBaseViewShiftLUTD()[iNeighborViewId][iCodedViewIdx],
1811      m_cCameraData.getBaseViewShiftLUTI()[iNeighborViewId][iCodedViewIdx],
1812      m_cCameraData.getBaseViewShiftLUTI()[iNeighborViewId][iCodedViewIdx],
1813      m_cCameraData.getBaseViewShiftLUTD()[iNeighborViewId][iCodedViewIdx],
1814      m_cCameraData.getBaseViewShiftLUTI()[iNeighborViewId][iCodedViewIdx],
1815      m_cCameraData.getBaseViewShiftLUTI()[iNeighborViewId][iCodedViewIdx],
1816      -1
1817      );
1818#else
1819#if NTT_SUBPEL
1820  m_cVSPRendererTop.setShiftLUTs(
1821      m_cCameraData.getBaseViewShiftLUTD()[iNeighborViewId][iCodedViewIdx],
1822      m_cCameraData.getBaseViewIPelLUT  ()[iNeighborViewId][iCodedViewIdx],
1823      NULL,
1824      m_cCameraData.getBaseViewShiftLUTD()[iNeighborViewId][iCodedViewIdx],
1825      m_cCameraData.getBaseViewIPelLUT  ()[iNeighborViewId][iCodedViewIdx],
1826      NULL,
1827      -1
1828      );
1829  m_cVSPRendererTop.setFposLUTs( 
1830      m_cCameraData.getBaseViewFPosLUT()[iNeighborViewId][iCodedViewIdx],
1831      m_cCameraData.getBaseViewFPosLUT()[iNeighborViewId][iCodedViewIdx]
1832      );
1833#else
1834  m_cVSPRendererTop.setShiftLUTs(
1835      m_cCameraData.getBaseViewShiftLUTD()[iNeighborViewId][iCodedViewIdx],
1836      m_cCameraData.getBaseViewShiftLUTI()[iNeighborViewId][iCodedViewIdx],
1837      NULL,
1838      m_cCameraData.getBaseViewShiftLUTD()[iNeighborViewId][iCodedViewIdx],
1839      m_cCameraData.getBaseViewShiftLUTI()[iNeighborViewId][iCodedViewIdx],
1840      NULL,
1841      -1
1842      );
1843#endif
1844#endif
1845
1846#if NTT_SUBPEL
1847  m_cVSPRendererTop.setInterpolationMode( (bDepth ? 0 : 5) );
1848#endif
1849
1850  //extrapolate from view iNeighborViewId to the current view, storing in the VSP buffer
1851  //m_cVSPRendererTop.extrapolateView(pcPicYuvVideo,pcPicYuvDepth, pcPicYuvVSP, bRenderFromLeft);
1852  m_cVSPRendererTop.extrapolateAvailabilityView(pcPicYuvVideo,pcPicYuvDepth, pcPicYuvVSP, pcPicYuvAvail, bRenderFromLeft);
1853
1854
1855  // mark it should be extended
1856  pcPicVSP->getPicYuvRec()->setBorderExtension(false); 
1857  pcPicVSP->getPicYuvRec()->extendPicBorder();//will extend the border for prediction using pixels outside the frame (done at the slice level as well
1858  pcPicAvail->getPicYuvRec()->setBorderExtension(false); 
1859  pcPicAvail->getPicYuvRec()->extendPicBorder();
1860
1861#if VSP_N_DUMP
1862  {
1863    Char acFilenameBase[1024];
1864    ::sprintf(acFilenameBase,"VSP_enc_%sv%d_%dx%d.yuv",(bDepth?"D":"T"),iCodedViewIdx,m_iSourceWidth, m_iSourceHeight);
1865    pcPicYuvVSP->dump(acFilenameBase,iCurPoc!=0);
1866    //pcPicYuvAvail->dump(acFilenameBase,iCurPoc!=0);
1867  }
1868#endif
1869
1870}
1871#endif
1872
1873//! \}
Note: See TracBrowser for help on using the repository browser.