source: 3DVCSoftware/branches/HTM-5.1-dev2-Sony/source/App/TAppEncoder/TAppEncTop.cpp @ 262

Last change on this file since 262 was 262, checked in by sony, 11 years ago

JCT2-C0115 Inter-view vector scaling for TMVP & flag
The macro is INTER_VIEW_VECTOR_SCALING_C0115.

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