source: 3DVCSoftware/branches/HTM-5.1-dev3-Mediatek/source/App/TAppEncoder/TAppEncTop.cpp @ 1417

Last change on this file since 1417 was 231, checked in by mitsubishi-htm, 12 years ago

-Integration of JCT3V-C0152 & JCT3V-C0131
-This check-in enable C0131 only

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