source: 3DVCSoftware/branches/HTM-6.2-dev1-MediaTek/source/App/TAppEncoder/TAppEncTop.cpp @ 384

Last change on this file since 384 was 384, checked in by mediatek-htm, 11 years ago

D0156 source code

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