source: 3DVCSoftware/branches/HTM-5.1-dev0/source/App/TAppEncoder/TAppEncTop.cpp @ 292

Last change on this file since 292 was 292, checked in by tech, 11 years ago

Removed macros related to IV motion parameter prediction.

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