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

Last change on this file since 483 was 295, checked in by tech, 12 years ago

Removed macros related to DMMs, IVRP and VSP/Texture Merge candidate.

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