source: 3DVCSoftware/branches/HTM-6.0-dev0/source/App/TAppEncoder/TAppEncTop.cpp @ 1417

Last change on this file since 1417 was 310, checked in by tech, 12 years ago

Incorporated MERL_VSP_C0152_BugFix_ForNoDepthCase

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