source: 3DVCSoftware/branches/HTM-11.0-dev0/source/Lib/TLibEncoder/TEncTop.cpp @ 962

Last change on this file since 962 was 962, checked in by tech, 10 years ago

Update to HM-14.0

Integration of:

#define H_MV_HLS_8_SYN_Q0041_03 1 #3 Syntax only (HS /Q0041/hybrid scalability) The proposed text was endorsed, with non-editorial open issues considered as follows …: #define H_MV_HLS_7_OTHER_P0187_1 0 (OTHER/P0187/NoOutputOfPriorPicsFlag) #1 Inference of NoOutputOfPriorPicsFlag and proposes to take into account colour format and bit depth for the inference in addition to spatial resolution
#define H_MV_HLS_8_SYN_39_19 1
#39 Syntax only + (PS/Q0165,Q0078/presence of num_add_output_layer_sets) proposal 2. change condition for presence of num_add_output_layer_sets to avoid sending it when there is only one layer set.
#define H_MV_HLS_8_HRD_Q0101_04 1 #4 (HRD /Q0101/Bitstream part buffer) On Bitstream Partition Buffer. Decision (BF/Cleanup): Adopt (sub-proposals 1–11, refined as described).
#define H_MV_HLS_8_PPS_NODOC_NN 1
#NN (PPS /NODOC/reserved flag): Add a flag in PPS for SHVC color gamut scalability
#define H_MV_HLS_8_MIS_Q0177_47 1 #47 (MISC /Q0177/EOS NAL) proposal 2: clarification of description of end of sequence NAL unit
#define H_MV_HLS_8_HRD_Q0182_05 1
#5 (HRD /Q0182/Bitstream part buffer) Decision (BF/Cleanup/Ed): Adopted (such that we use the main proposal for sub-proposal 1, and alternative 1 for sub-proposal 2). + #define H_MV_HLS_8_HRD_Q0182_06 0 #6 (HRD /Q0182/hrd_parameters) Sub-proposal 2 Alternative 1: Clarify that the VPS hrd_parameters( ) syntax structure that applies to the layer set which is associated with the bitstream partition initial arrival time SEI message is used to determine the lengths of the nal_initial_arrival_delay[ i ] and vcl_initial_arrival_delay[ i ] syntax elements. Decision (BF/Cleanup/Ed): Adopted alternative 1 for sub-proposal 2
#define H_MV_HLS_8_SPS_NODOC_48 1
#48 (SPS /NODOC/PPS extension cleanups) Alignment with RExt
#define H_MV_HLS_8_DBP_NODOC_42 1 #42 (DBP /NODOC/sharing) Remove sub-DPB sharing and processes that mark inter-layer reference pictures as "unused for reference"
#define H_MV_HLS_8_RPS_Q0100_36 1
#36 (RPS /Q0100/constraint to semantics) v3, add constraint to RPS semantics
#define H_MV_HLS_8_POC_Q0142_32 1 #32 (POC /Q0142/poc_lsb_not_present_flag) v2: Add semantic constraints to poc_lsb_not_present_flag.
#define H_MV_HLS_8_HRD_Q0102_08 1
#8 (HRD /Q0102/sps_max_dec_pic_buffering_minus1) Sub-proposal 2: A semantics bug fix is proposed for sps_max_dec_pic_buffering_minus1 as a bug-fix. In discussion, the first option was preferred. Decision (BF/Cleanup/Ed.): Adopt.
#define H_MV_HLS_8_MIS_Q0102_30 1 #30 (MISC /Q0102/loop index) proposal 3, change the max loop index for signaling bit rate and pic rate info to MaxSubLayersInLayerSetMinus1
#define H_MV_HLS_8_GEN_Q0108_13 1
#13 (GEN /Q0108/STSA TemporalId) Agreed to remove restriction from proposal 2, to allow STSA pics of non-base layers to have TemporalId equal to 0.
#define H_MV_HLS_8_PMS_Q0195_21 1 #21 (PS /Q0195/constraint update_ref_format_flag) proposal 2: add a semantic constraint on the value of update_ref_format_flag
#define H_MV_HLS_8_PMS_Q0195_20 1
#20 (PS /Q0195/syntax table rep format) proposal 1: restructure syntax table for sending of rep_format_idx_present_flag and vps_num_ref_formats_minus1
#define H_MV_HLS_8_MIS_Q0177_22 1 #22 (MISC /Q0177/inference sps_temporal_id_nesting_flag) proposal 1: modify inference rule for sps_temporal_id_nesting_flag when it is not present
#define H_MV_HLS_8_PMS_Q0165_18 1
#18 (PS /Q0165/disallow an empty layer set) proposal 1.a), add a constraint to disallow an empty layer set
#define H_MV_HLS_8_RPS_Q0060_17 1 #17 (RPS /Q0060/condition refLayerPicIdc) Proposal 2: Add a condition to the derivation of refLayerPicIdc of (TemporalId == 0)
#define H_MV_HLS_8_POC_Q0146_15 1
#15 (POC /Q0146/inference of poc_msb_val_present_flag) Proposal 1.1: Change inference rule in semantics of poc_msb_val_present_flag

  • Property svn:eol-style set to native
File size: 48.2 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-2014, 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     TEncTop.cpp
35    \brief    encoder class
36*/
37
38#include "TLibCommon/CommonDef.h"
39#include "TEncTop.h"
40#include "TEncPic.h"
41#if FAST_BIT_EST
42#include "TLibCommon/ContextModel.h"
43#endif
44#if H_MV
45#include "../../App/TAppEncoder/TAppEncTop.h"
46#endif
47
48//! \ingroup TLibEncoder
49//! \{
50
51// ====================================================================================================================
52// Constructor / destructor / create / destroy
53// ====================================================================================================================
54
55TEncTop::TEncTop()
56{
57  m_iPOCLast          = -1;
58  m_iNumPicRcvd       =  0;
59  m_uiNumAllPicCoded  =  0;
60  m_pppcRDSbacCoder   =  NULL;
61  m_pppcBinCoderCABAC =  NULL;
62  m_cRDGoOnSbacCoder.init( &m_cRDGoOnBinCoderCABAC );
63#if ENC_DEC_TRACE
64  g_hTrace = fopen( "TraceEnc.txt", "wb" );
65  g_bJustDoIt = g_bEncDecTraceDisable;
66  g_nSymbolCounter = 0;
67#endif
68
69  m_iMaxRefPicNum     = 0;
70
71#if FAST_BIT_EST
72  ContextModel::buildNextStateTable();
73#endif
74
75  m_pcSbacCoders           = NULL;
76  m_pcBinCoderCABACs       = NULL;
77  m_ppppcRDSbacCoders      = NULL;
78  m_ppppcBinCodersCABAC    = NULL;
79  m_pcRDGoOnSbacCoders     = NULL;
80  m_pcRDGoOnBinCodersCABAC = NULL;
81  m_pcBitCounters          = NULL;
82  m_pcRdCosts              = NULL;
83#if H_MV
84  m_ivPicLists = NULL;
85#endif
86}
87
88TEncTop::~TEncTop()
89{
90#if ENC_DEC_TRACE
91  fclose( g_hTrace );
92#endif
93}
94
95Void TEncTop::create ()
96{
97#if !H_MV
98  // initialize global variables
99  initROM();
100#endif
101 
102  // create processing unit classes
103  m_cGOPEncoder.        create();
104  m_cSliceEncoder.      create( getSourceWidth(), getSourceHeight(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth );
105  m_cCuEncoder.         create( g_uiMaxCUDepth, g_uiMaxCUWidth, g_uiMaxCUHeight );
106  if (m_bUseSAO)
107  {
108    m_cEncSAO.create( getSourceWidth(), getSourceHeight(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth );
109#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
110    m_cEncSAO.createEncData(getSaoLcuBoundary());
111#else
112    m_cEncSAO.createEncData();
113#endif
114  }
115#if ADAPTIVE_QP_SELECTION
116  if (m_bUseAdaptQpSelect)
117  {
118    m_cTrQuant.initSliceQpDelta();
119  }
120#endif
121  m_cLoopFilter.        create( g_uiMaxCUDepth );
122
123  if ( m_RCEnableRateControl )
124  {
125#if KWU_RC_MADPRED_E0227
126    m_cRateCtrl.init( m_framesToBeEncoded, m_RCTargetBitrate, m_iFrameRate, m_iGOPSize, m_iSourceWidth, m_iSourceHeight,
127      g_uiMaxCUWidth, g_uiMaxCUHeight, m_RCKeepHierarchicalBit, m_RCUseLCUSeparateModel, m_GOPList, getLayerId() );
128#else
129    m_cRateCtrl.init( m_framesToBeEncoded, m_RCTargetBitrate, m_iFrameRate, m_iGOPSize, m_iSourceWidth, m_iSourceHeight,
130                      g_uiMaxCUWidth, g_uiMaxCUHeight, m_RCKeepHierarchicalBit, m_RCUseLCUSeparateModel, m_GOPList );
131#endif
132  }
133    m_pppcRDSbacCoder = new TEncSbac** [g_uiMaxCUDepth+1];
134#if FAST_BIT_EST
135    m_pppcBinCoderCABAC = new TEncBinCABACCounter** [g_uiMaxCUDepth+1];
136#else
137    m_pppcBinCoderCABAC = new TEncBinCABAC** [g_uiMaxCUDepth+1];
138#endif
139   
140    for ( Int iDepth = 0; iDepth < g_uiMaxCUDepth+1; iDepth++ )
141    {
142      m_pppcRDSbacCoder[iDepth] = new TEncSbac* [CI_NUM];
143#if FAST_BIT_EST
144      m_pppcBinCoderCABAC[iDepth] = new TEncBinCABACCounter* [CI_NUM];
145#else
146      m_pppcBinCoderCABAC[iDepth] = new TEncBinCABAC* [CI_NUM];
147#endif
148     
149      for (Int iCIIdx = 0; iCIIdx < CI_NUM; iCIIdx ++ )
150      {
151        m_pppcRDSbacCoder[iDepth][iCIIdx] = new TEncSbac;
152#if FAST_BIT_EST
153        m_pppcBinCoderCABAC [iDepth][iCIIdx] = new TEncBinCABACCounter;
154#else
155        m_pppcBinCoderCABAC [iDepth][iCIIdx] = new TEncBinCABAC;
156#endif
157        m_pppcRDSbacCoder   [iDepth][iCIIdx]->init( m_pppcBinCoderCABAC [iDepth][iCIIdx] );
158      }
159    }
160  }
161
162/**
163 - Allocate coders required for wavefront for the nominated number of substreams.
164 .
165 \param iNumSubstreams Determines how much information to allocate.
166 */
167Void TEncTop::createWPPCoders(Int iNumSubstreams)
168{
169  if (m_pcSbacCoders != NULL)
170  {
171    return; // already generated.
172  }
173
174  m_iNumSubstreams         = iNumSubstreams;
175  m_pcSbacCoders           = new TEncSbac       [iNumSubstreams];
176  m_pcBinCoderCABACs       = new TEncBinCABAC   [iNumSubstreams];
177  m_pcRDGoOnSbacCoders     = new TEncSbac       [iNumSubstreams];
178  m_pcRDGoOnBinCodersCABAC = new TEncBinCABAC   [iNumSubstreams];
179  m_pcBitCounters          = new TComBitCounter [iNumSubstreams];
180  m_pcRdCosts              = new TComRdCost     [iNumSubstreams];
181
182  for ( UInt ui = 0 ; ui < iNumSubstreams; ui++ )
183  {
184    m_pcRDGoOnSbacCoders[ui].init( &m_pcRDGoOnBinCodersCABAC[ui] );
185    m_pcSbacCoders[ui].init( &m_pcBinCoderCABACs[ui] );
186  }
187
188    m_ppppcRDSbacCoders      = new TEncSbac***    [iNumSubstreams];
189    m_ppppcBinCodersCABAC    = new TEncBinCABAC***[iNumSubstreams];
190    for ( UInt ui = 0 ; ui < iNumSubstreams ; ui++ )
191    {
192      m_ppppcRDSbacCoders[ui]  = new TEncSbac** [g_uiMaxCUDepth+1];
193      m_ppppcBinCodersCABAC[ui]= new TEncBinCABAC** [g_uiMaxCUDepth+1];
194     
195      for ( Int iDepth = 0; iDepth < g_uiMaxCUDepth+1; iDepth++ )
196      {
197        m_ppppcRDSbacCoders[ui][iDepth]  = new TEncSbac*     [CI_NUM];
198        m_ppppcBinCodersCABAC[ui][iDepth]= new TEncBinCABAC* [CI_NUM];
199
200        for (Int iCIIdx = 0; iCIIdx < CI_NUM; iCIIdx ++ )
201        {
202          m_ppppcRDSbacCoders  [ui][iDepth][iCIIdx] = new TEncSbac;
203          m_ppppcBinCodersCABAC[ui][iDepth][iCIIdx] = new TEncBinCABAC;
204          m_ppppcRDSbacCoders  [ui][iDepth][iCIIdx]->init( m_ppppcBinCodersCABAC[ui][iDepth][iCIIdx] );
205        }
206      }
207    }
208  }
209
210Void TEncTop::destroy ()
211{
212  // destroy processing unit classes
213  m_cGOPEncoder.        destroy();
214  m_cSliceEncoder.      destroy();
215  m_cCuEncoder.         destroy();
216  if (m_cSPS.getUseSAO())
217  {
218    m_cEncSAO.destroyEncData();
219    m_cEncSAO.destroy();
220  }
221  m_cLoopFilter.        destroy();
222  m_cRateCtrl.          destroy();
223
224    Int iDepth;
225    for ( iDepth = 0; iDepth < g_uiMaxCUDepth+1; iDepth++ )
226    {
227      for (Int iCIIdx = 0; iCIIdx < CI_NUM; iCIIdx ++ )
228      {
229        delete m_pppcRDSbacCoder[iDepth][iCIIdx];
230        delete m_pppcBinCoderCABAC[iDepth][iCIIdx];
231      }
232    }
233   
234    for ( iDepth = 0; iDepth < g_uiMaxCUDepth+1; iDepth++ )
235    {
236      delete [] m_pppcRDSbacCoder[iDepth];
237      delete [] m_pppcBinCoderCABAC[iDepth];
238    }
239   
240    delete [] m_pppcRDSbacCoder;
241    delete [] m_pppcBinCoderCABAC;
242
243    for ( UInt ui = 0; ui < m_iNumSubstreams; ui++ )
244    {
245      for ( iDepth = 0; iDepth < g_uiMaxCUDepth+1; iDepth++ )
246      {
247        for (Int iCIIdx = 0; iCIIdx < CI_NUM; iCIIdx ++ )
248        {
249          delete m_ppppcRDSbacCoders  [ui][iDepth][iCIIdx];
250          delete m_ppppcBinCodersCABAC[ui][iDepth][iCIIdx];
251        }
252      }
253
254      for ( iDepth = 0; iDepth < g_uiMaxCUDepth+1; iDepth++ )
255      {
256        delete [] m_ppppcRDSbacCoders  [ui][iDepth];
257        delete [] m_ppppcBinCodersCABAC[ui][iDepth];
258      }
259      delete[] m_ppppcRDSbacCoders  [ui];
260      delete[] m_ppppcBinCodersCABAC[ui];
261    }
262    delete[] m_ppppcRDSbacCoders;
263    delete[] m_ppppcBinCodersCABAC;
264  delete[] m_pcSbacCoders;
265  delete[] m_pcBinCoderCABACs;
266  delete[] m_pcRDGoOnSbacCoders; 
267  delete[] m_pcRDGoOnBinCodersCABAC;
268  delete[] m_pcBitCounters;
269  delete[] m_pcRdCosts;
270 
271#if !H_MV
272    // destroy ROM
273  destroyROM();
274#endif
275
276  return;
277}
278
279#if KWU_RC_MADPRED_E0227
280Void TEncTop::init(TAppEncTop* pcTAppEncTop, Bool isFieldCoding)
281#else
282Void TEncTop::init(Bool isFieldCoding)
283#endif
284{
285  // initialize SPS
286#if H_3D
287  // Assuming that all PPS indirectly refer to the same VPS via different SPS
288  m_cSPS.setVPS(m_cVPS);
289#endif
290  xInitSPS();
291 
292  /* set the VPS profile information */
293#if H_MV
294  // This seems to be incorrect, but irrelevant for the MV-HEVC
295  *(m_cVPS->getPTL()) = *m_cSPS.getPTL();
296  m_cVPS->getTimingInfo()->setTimingInfoPresentFlag       ( false );
297#else
298  *m_cVPS.getPTL() = *m_cSPS.getPTL();
299  m_cVPS.getTimingInfo()->setTimingInfoPresentFlag       ( false );
300#endif
301  // initialize PPS
302  m_cPPS.setSPS(&m_cSPS);
303  xInitPPS();
304  xInitRPS(isFieldCoding);
305
306  xInitPPSforTiles();
307
308  // initialize processing unit classes
309  m_cGOPEncoder.  init( this );
310  m_cSliceEncoder.init( this );
311  m_cCuEncoder.   init( this );
312 
313#if KWU_RC_MADPRED_E0227
314  m_pcTAppEncTop = pcTAppEncTop;
315#endif
316  // initialize transform & quantization class
317  m_pcCavlcCoder = getCavlcCoder();
318 
319  m_cTrQuant.init( 1 << m_uiQuadtreeTULog2MaxSize,
320                  m_useRDOQ, 
321                  m_useRDOQTS,
322                  true 
323                  ,m_useTransformSkipFast
324#if ADAPTIVE_QP_SELECTION                 
325                  , m_bUseAdaptQpSelect
326#endif
327                  );
328 
329  // initialize encoder search class
330  m_cSearch.init( this, &m_cTrQuant, m_iSearchRange, m_bipredSearchRange, m_iFastSearch, 0, &m_cEntropyCoder, &m_cRdCost, getRDSbacCoder(), getRDGoOnSbacCoder() );
331
332  m_iMaxRefPicNum = 0;
333}
334
335// ====================================================================================================================
336// Public member functions
337// ====================================================================================================================
338
339#if H_MV
340Void TEncTop::initNewPic( TComPicYuv* pcPicYuvOrg )
341{
342  TComPic* pcPicCurr = NULL;
343
344  // get original YUV
345  xGetNewPicBuffer( pcPicCurr );
346  pcPicYuvOrg->copyToPic( pcPicCurr->getPicYuvOrg() );
347
348  // compute image characteristics
349  if ( getUseAdaptiveQP() )
350  {
351    m_cPreanalyzer.xPreanalyze( dynamic_cast<TEncPic*>( pcPicCurr ) );
352  }
353#if H_MV
354  pcPicCurr->setLayerId( getLayerId()); 
355#endif
356#if H_3D
357  pcPicCurr->setScaleOffset( m_aaiCodedScale, m_aaiCodedOffset );
358#endif
359}
360#endif
361Void TEncTop::deletePicBuffer()
362{
363  TComList<TComPic*>::iterator iterPic = m_cListPic.begin();
364  Int iSize = Int( m_cListPic.size() );
365 
366  for ( Int i = 0; i < iSize; i++ )
367  {
368    TComPic* pcPic = *(iterPic++);
369   
370    pcPic->destroy();
371    delete pcPic;
372    pcPic = NULL;
373  }
374}
375
376/**
377 - Application has picture buffer list with size of GOP + 1
378 - Picture buffer list acts like as ring buffer
379 - End of the list has the latest picture
380 .
381 \param   flush               cause encoder to encode a partial GOP
382 \param   pcPicYuvOrg         original YUV picture
383 \retval  rcListPicYuvRecOut  list of reconstruction YUV pictures
384 \retval  rcListBitstreamOut  list of output bitstreams
385 \retval  iNumEncoded         number of encoded pictures
386 */
387#if H_MV
388Void TEncTop::encode(Bool flush, TComPicYuv* pcPicYuvOrg, TComList<TComPicYuv*>& rcListPicYuvRecOut, std::list<AccessUnit>& accessUnitsOut, Int& iNumEncoded , Int gopId )
389{
390#else
391Void TEncTop::encode(Bool flush, TComPicYuv* pcPicYuvOrg, TComList<TComPicYuv*>& rcListPicYuvRecOut, std::list<AccessUnit>& accessUnitsOut, Int& iNumEncoded )
392{
393#endif
394#if H_3D
395  TComPic* picLastCoded = getPic( getGOPEncoder()->getPocLastCoded() );
396  if( picLastCoded )
397  {
398    picLastCoded->compressMotion(1); 
399  }
400#endif
401#if H_MV
402  if( gopId == 0)
403  {
404    m_cGOPEncoder.initGOP(m_iPOCLast, m_iNumPicRcvd, m_cListPic, rcListPicYuvRecOut, accessUnitsOut); 
405#else
406  if (pcPicYuvOrg) {
407    // get original YUV
408    TComPic* pcPicCurr = NULL;
409    xGetNewPicBuffer( pcPicCurr );
410    pcPicYuvOrg->copyToPic( pcPicCurr->getPicYuvOrg() );
411
412    // compute image characteristics
413    if ( getUseAdaptiveQP() )
414    {
415      m_cPreanalyzer.xPreanalyze( dynamic_cast<TEncPic*>( pcPicCurr ) );
416    }
417  }
418 
419  if (!m_iNumPicRcvd || (!flush && m_iPOCLast != 0 && m_iNumPicRcvd != m_iGOPSize && m_iGOPSize))
420  {
421    iNumEncoded = 0;
422    return;
423  }
424#endif
425 
426  if ( m_RCEnableRateControl )
427  {
428    m_cRateCtrl.initRCGOP( m_iNumPicRcvd );
429  }
430#if H_MV
431  }
432  m_cGOPEncoder.compressPicInGOP(m_iPOCLast, m_iNumPicRcvd, m_cListPic, rcListPicYuvRecOut, accessUnitsOut, gopId, false, false );
433
434  if( gopId + 1 == m_cGOPEncoder.getGOPSize() )
435  {
436#else
437  // compress GOP
438  m_cGOPEncoder.compressGOP(m_iPOCLast, m_iNumPicRcvd, m_cListPic, rcListPicYuvRecOut, accessUnitsOut, false, false);
439#endif
440
441  if ( m_RCEnableRateControl )
442  {
443    m_cRateCtrl.destroyRCGOP();
444  }
445 
446  iNumEncoded         = m_iNumPicRcvd;
447  m_iNumPicRcvd       = 0;
448  m_uiNumAllPicCoded += iNumEncoded;
449#if H_MV
450}
451#endif
452}
453/**------------------------------------------------
454 Separate interlaced frame into two fields
455 -------------------------------------------------**/
456void separateFields(Pel* org, Pel* dstField, UInt stride, UInt width, UInt height, bool isTop)
457{
458  if (!isTop)
459  {
460    org += stride;
461  }
462  for (Int y = 0; y < height>>1; y++)
463  {
464    for (Int x = 0; x < width; x++)
465    {
466      dstField[x] = org[x];
467    }
468   
469    dstField += stride;
470    org += stride*2;
471  }
472 
473}
474
475#if H_MV
476Void TEncTop::encode(Bool flush, TComPicYuv* pcPicYuvOrg, TComList<TComPicYuv*>& rcListPicYuvRecOut, std::list<AccessUnit>& accessUnitsOut, Int& iNumEncoded, bool isTff, Int gopId )
477{
478  assert( 0 ); // Field coding and multiview need to be furhter harmonized.
479}
480#else
481Void TEncTop::encode(Bool flush, TComPicYuv* pcPicYuvOrg, TComList<TComPicYuv*>& rcListPicYuvRecOut, std::list<AccessUnit>& accessUnitsOut, Int& iNumEncoded, bool isTff)
482{
483  /* -- TOP FIELD -- */
484 
485  if (pcPicYuvOrg)
486  {
487   
488    /* -- Top field initialization -- */
489   
490    TComPic *pcTopField;
491    xGetNewPicBuffer( pcTopField );
492    pcTopField->setReconMark (false);
493   
494    pcTopField->getSlice(0)->setPOC( m_iPOCLast );
495    pcTopField->getPicYuvRec()->setBorderExtension(false);
496    pcTopField->setTopField(isTff);
497   
498    int nHeight = pcPicYuvOrg->getHeight();
499    int nWidth = pcPicYuvOrg->getWidth();
500    int nStride = pcPicYuvOrg->getStride();
501    int nPadLuma = pcPicYuvOrg->getLumaMargin();
502    int nPadChroma = pcPicYuvOrg->getChromaMargin();
503   
504    // Get pointers
505    Pel * PicBufY = pcPicYuvOrg->getBufY();
506    Pel * PicBufU = pcPicYuvOrg->getBufU();
507    Pel * PicBufV = pcPicYuvOrg->getBufV();
508   
509    Pel * pcTopFieldY =  pcTopField->getPicYuvOrg()->getLumaAddr();
510    Pel * pcTopFieldU =  pcTopField->getPicYuvOrg()->getCbAddr();
511    Pel * pcTopFieldV =  pcTopField->getPicYuvOrg()->getCrAddr();
512   
513    /* -- Defield -- */
514   
515    bool isTop = isTff;
516   
517    separateFields(PicBufY + nPadLuma + nStride*nPadLuma, pcTopFieldY, nStride, nWidth, nHeight, isTop);
518    separateFields(PicBufU + nPadChroma + (nStride >> 1)*nPadChroma, pcTopFieldU, nStride >> 1, nWidth >> 1, nHeight >> 1, isTop);
519    separateFields(PicBufV + nPadChroma + (nStride >> 1)*nPadChroma, pcTopFieldV, nStride >> 1, nWidth >> 1, nHeight >> 1, isTop);
520   
521    // compute image characteristics
522    if ( getUseAdaptiveQP() )
523    {
524      m_cPreanalyzer.xPreanalyze( dynamic_cast<TEncPic*>( pcTopField ) );
525    }   
526  }
527 
528  if (m_iPOCLast == 0) // compress field 0
529  {
530    m_cGOPEncoder.compressGOP(m_iPOCLast, m_iNumPicRcvd, m_cListPic, rcListPicYuvRecOut, accessUnitsOut, true, isTff);
531  }
532 
533  /* -- BOTTOM FIELD -- */
534 
535  if (pcPicYuvOrg)
536  {
537   
538    /* -- Bottom field initialization -- */
539   
540    TComPic* pcBottomField;
541    xGetNewPicBuffer( pcBottomField );
542    pcBottomField->setReconMark (false);
543   
544    TComPicYuv* rpcPicYuvRec;
545    if ( rcListPicYuvRecOut.size() == (UInt)m_iGOPSize )
546    {
547      rpcPicYuvRec = rcListPicYuvRecOut.popFront();
548    }
549    else
550    {
551      rpcPicYuvRec = new TComPicYuv;
552      rpcPicYuvRec->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth );
553    }
554    rcListPicYuvRecOut.pushBack( rpcPicYuvRec );
555   
556    pcBottomField->getSlice(0)->setPOC( m_iPOCLast);
557    pcBottomField->getPicYuvRec()->setBorderExtension(false);
558    pcBottomField->setTopField(!isTff);
559   
560    int nHeight = pcPicYuvOrg->getHeight();
561    int nWidth = pcPicYuvOrg->getWidth();
562    int nStride = pcPicYuvOrg->getStride();
563    int nPadLuma = pcPicYuvOrg->getLumaMargin();
564    int nPadChroma = pcPicYuvOrg->getChromaMargin();
565   
566    // Get pointers
567    Pel * PicBufY = pcPicYuvOrg->getBufY();
568    Pel * PicBufU = pcPicYuvOrg->getBufU();
569    Pel * PicBufV = pcPicYuvOrg->getBufV();
570   
571    Pel * pcBottomFieldY =  pcBottomField->getPicYuvOrg()->getLumaAddr();
572    Pel * pcBottomFieldU =  pcBottomField->getPicYuvOrg()->getCbAddr();
573    Pel * pcBottomFieldV =  pcBottomField->getPicYuvOrg()->getCrAddr();
574   
575    /* -- Defield -- */
576   
577    bool isTop = !isTff;
578   
579    separateFields(PicBufY + nPadLuma + nStride*nPadLuma, pcBottomFieldY, nStride, nWidth, nHeight, isTop);
580    separateFields(PicBufU + nPadChroma + (nStride >> 1)*nPadChroma, pcBottomFieldU, nStride >> 1, nWidth >> 1, nHeight >> 1, isTop);
581    separateFields(PicBufV + nPadChroma + (nStride >> 1)*nPadChroma, pcBottomFieldV, nStride >> 1, nWidth >> 1, nHeight >> 1, isTop);
582   
583    // Compute image characteristics
584    if ( getUseAdaptiveQP() )
585    {
586      m_cPreanalyzer.xPreanalyze( dynamic_cast<TEncPic*>( pcBottomField ) );
587    }   
588  }
589 
590  if ( ( !(m_iNumPicRcvd) || (!flush && m_iPOCLast != 1 && m_iNumPicRcvd != m_iGOPSize && m_iGOPSize)) )
591  {
592    iNumEncoded = 0;
593    return;
594  }
595 
596  // compress GOP
597  m_cGOPEncoder.compressGOP(m_iPOCLast, m_iNumPicRcvd, m_cListPic, rcListPicYuvRecOut, accessUnitsOut, true, isTff);
598 
599  iNumEncoded = m_iNumPicRcvd;
600  m_iNumPicRcvd = 0;
601  m_uiNumAllPicCoded += iNumEncoded;
602}
603#endif
604// ====================================================================================================================
605// Protected member functions
606// ====================================================================================================================
607
608/**
609 - Application has picture buffer list with size of GOP + 1
610 - Picture buffer list acts like as ring buffer
611 - End of the list has the latest picture
612 .
613 \retval rpcPic obtained picture buffer
614 */
615Void TEncTop::xGetNewPicBuffer ( TComPic*& rpcPic )
616{
617  TComSlice::sortPicList(m_cListPic);
618 
619  if (m_cListPic.size() >= (UInt)(m_iGOPSize + getMaxDecPicBuffering(MAX_TLAYER-1) + 2) )
620  {
621    TComList<TComPic*>::iterator iterPic  = m_cListPic.begin();
622    Int iSize = Int( m_cListPic.size() );
623    for ( Int i = 0; i < iSize; i++ )
624    {
625      rpcPic = *(iterPic++);
626      if(rpcPic->getSlice(0)->isReferenced() == false)
627      {
628        break;
629      }
630    }
631  }
632  else
633  {
634    if ( getUseAdaptiveQP() )
635    {
636      TEncPic* pcEPic = new TEncPic;
637      pcEPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, m_cPPS.getMaxCuDQPDepth()+1 ,
638                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics);
639      rpcPic = pcEPic;
640    }
641    else
642    {
643      rpcPic = new TComPic;
644
645      rpcPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, 
646                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics);
647    }
648    m_cListPic.pushBack( rpcPic );
649  }
650  rpcPic->setReconMark (false);
651 
652  m_iPOCLast++;
653  m_iNumPicRcvd++;
654 
655  rpcPic->getSlice(0)->setPOC( m_iPOCLast );
656  // mark it should be extended
657  rpcPic->getPicYuvRec()->setBorderExtension(false);
658
659#if H_MV
660  rpcPic->getPicYuvOrg()->setBorderExtension(false);
661#endif
662}
663
664Void TEncTop::xInitSPS()
665{
666#if H_MV
667  m_cSPS.setSPSId( getLayerIdInVps() );
668  m_cSPS.setLayerId( getLayerId() );
669 // Code below needs to be moved to VPS
670#endif
671  ProfileTierLevel& profileTierLevel = *m_cSPS.getPTL()->getGeneralPTL();
672  profileTierLevel.setLevelIdc(m_level);
673  profileTierLevel.setTierFlag(m_levelTier);
674  profileTierLevel.setProfileIdc(m_profile);
675  profileTierLevel.setProfileCompatibilityFlag(m_profile, 1);
676  profileTierLevel.setProgressiveSourceFlag(m_progressiveSourceFlag);
677  profileTierLevel.setInterlacedSourceFlag(m_interlacedSourceFlag);
678  profileTierLevel.setNonPackedConstraintFlag(m_nonPackedConstraintFlag);
679  profileTierLevel.setFrameOnlyConstraintFlag(m_frameOnlyConstraintFlag);
680 
681  if (m_profile == Profile::MAIN10 && g_bitDepthY == 8 && g_bitDepthC == 8)
682  {
683    /* The above constraint is equal to Profile::MAIN */
684    profileTierLevel.setProfileCompatibilityFlag(Profile::MAIN, 1);
685  }
686  if (m_profile == Profile::MAIN)
687  {
688    /* A Profile::MAIN10 decoder can always decode Profile::MAIN */
689    profileTierLevel.setProfileCompatibilityFlag(Profile::MAIN10, 1);
690  }
691  /* XXX: should Main be marked as compatible with still picture? */
692  /* XXX: may be a good idea to refactor the above into a function
693   * that chooses the actual compatibility based upon options */
694
695#if H_MV 
696  m_cSPS.setUpdateRepFormatFlag           ( false );   
697  m_cSPS.setSpsInferScalingListFlag       ( m_layerId > 0 && m_cVPS->getInDirectDependencyFlag( getLayerIdInVps(), 0 ) ); 
698  m_cSPS.setSpsScalingListRefLayerId      ( 0              ); 
699  m_cSPS.setSpsExtensionPresentFlag              ( true ); 
700#if H_MV_HLS_8_SPS_NODOC_48
701  m_cSPS.setSpsMultilayerExtensionFlag    ( true ); 
702#else
703  m_cSPS.setSpsExtensionTypeFlag          ( PS_EX_T_MV ,true ); 
704#endif
705#if H_3D
706#if H_MV_HLS_8_SPS_NODOC_48
707  m_cSPS.setSps3dExtensionFlag            ( true ); 
708#else
709  m_cSPS.setSpsExtensionTypeFlag          ( PS_EX_T_3D ,true ); 
710#endif
711#endif
712#endif
713  m_cSPS.setPicWidthInLumaSamples         ( m_iSourceWidth      );
714  m_cSPS.setPicHeightInLumaSamples        ( m_iSourceHeight     );
715  m_cSPS.setConformanceWindow             ( m_conformanceWindow );
716  m_cSPS.setMaxCUWidth    ( g_uiMaxCUWidth      );
717  m_cSPS.setMaxCUHeight   ( g_uiMaxCUHeight     );
718  m_cSPS.setMaxCUDepth    ( g_uiMaxCUDepth      );
719
720  Int minCUSize = m_cSPS.getMaxCUWidth() >> ( m_cSPS.getMaxCUDepth()-g_uiAddCUDepth );
721  Int log2MinCUSize = 0;
722  while(minCUSize > 1)
723  {
724    minCUSize >>= 1;
725    log2MinCUSize++;
726  }
727
728  m_cSPS.setLog2MinCodingBlockSize(log2MinCUSize);
729  m_cSPS.setLog2DiffMaxMinCodingBlockSize(m_cSPS.getMaxCUDepth()-g_uiAddCUDepth);
730 
731  m_cSPS.setPCMLog2MinSize (m_uiPCMLog2MinSize);
732  m_cSPS.setUsePCM        ( m_usePCM           );
733  m_cSPS.setPCMLog2MaxSize( m_pcmLog2MaxSize  );
734
735  m_cSPS.setQuadtreeTULog2MaxSize( m_uiQuadtreeTULog2MaxSize );
736  m_cSPS.setQuadtreeTULog2MinSize( m_uiQuadtreeTULog2MinSize );
737  m_cSPS.setQuadtreeTUMaxDepthInter( m_uiQuadtreeTUMaxDepthInter    );
738  m_cSPS.setQuadtreeTUMaxDepthIntra( m_uiQuadtreeTUMaxDepthIntra    );
739 
740  m_cSPS.setTMVPFlagsPresent(false);
741
742  m_cSPS.setMaxTrSize   ( 1 << m_uiQuadtreeTULog2MaxSize );
743 
744  Int i;
745 
746  for (i = 0; i < g_uiMaxCUDepth-g_uiAddCUDepth; i++ )
747  {
748    m_cSPS.setAMPAcc( i, m_useAMP );
749    //m_cSPS.setAMPAcc( i, 1 );
750  }
751
752  m_cSPS.setUseAMP ( m_useAMP );
753
754#if H_3D_QTLPC
755  m_cSPS.setUseQTL( m_bUseQTL );
756  m_cSPS.setUsePC ( m_bUsePC  );
757#endif
758
759  for (i = g_uiMaxCUDepth-g_uiAddCUDepth; i < g_uiMaxCUDepth; i++ )
760  {
761    m_cSPS.setAMPAcc(i, 0);
762  }
763
764  m_cSPS.setBitDepthY( g_bitDepthY );
765  m_cSPS.setBitDepthC( g_bitDepthC );
766
767  m_cSPS.setQpBDOffsetY ( 6*(g_bitDepthY - 8) );
768  m_cSPS.setQpBDOffsetC ( 6*(g_bitDepthC - 8) );
769
770  m_cSPS.setUseSAO( m_bUseSAO );
771
772  m_cSPS.setMaxTLayers( m_maxTempLayer );
773  m_cSPS.setTemporalIdNestingFlag( ( m_maxTempLayer == 1 ) ? true : false );
774  for ( i = 0; i < min(m_cSPS.getMaxTLayers(),(UInt) MAX_TLAYER); i++ )
775  {
776    m_cSPS.setMaxDecPicBuffering(m_maxDecPicBuffering[i], i);
777    m_cSPS.setNumReorderPics(m_numReorderPics[i], i);
778  }
779#if H_MV_HLS_8_HRD_Q0102_08
780  for ( Int ols = 0; ols < m_cVPS->getNumOutputLayerSets(); ols++)
781  {
782    // Check MaxDecPicBuffering
783    const std::vector<Int>& targetDecLayerIdList = m_cVPS->getTargetDecLayerIdList( m_cVPS->olsIdxToLsIdx( ols )); 
784    for( Int is = 0; is < targetDecLayerIdList.size(); is++  )
785    {
786      m_cSPS.inferSpsMaxDecPicBufferingMinus1( m_cVPS, ols, targetDecLayerIdList[is], true );       
787    }
788  }
789
790#if H_MV_HLS_8_RPS_Q0100_36
791  m_cVPS->inferDbpSizeLayerSetZero( &m_cSPS, true ); 
792#endif
793
794#endif
795  m_cSPS.setPCMBitDepthLuma (g_uiPCMBitDepthLuma);
796  m_cSPS.setPCMBitDepthChroma (g_uiPCMBitDepthChroma);
797  m_cSPS.setPCMFilterDisableFlag  ( m_bPCMFilterDisableFlag );
798
799  m_cSPS.setScalingListFlag ( (m_useScalingListId == 0) ? 0 : 1 );
800
801  m_cSPS.setUseStrongIntraSmoothing( m_useStrongIntraSmoothing );
802
803  m_cSPS.setVuiParametersPresentFlag(getVuiParametersPresentFlag());
804  if (m_cSPS.getVuiParametersPresentFlag())
805  {
806    TComVUI* pcVUI = m_cSPS.getVuiParameters();
807    pcVUI->setAspectRatioInfoPresentFlag(getAspectRatioIdc() != -1);
808    pcVUI->setAspectRatioIdc(getAspectRatioIdc());
809    pcVUI->setSarWidth(getSarWidth());
810    pcVUI->setSarHeight(getSarHeight());
811    pcVUI->setOverscanInfoPresentFlag(getOverscanInfoPresentFlag());
812    pcVUI->setOverscanAppropriateFlag(getOverscanAppropriateFlag());
813#if H_MV
814    pcVUI->setVideoSignalTypePresentFlag(getVideoSignalTypePresentFlag() && getLayerId() == 0 );
815#else
816   pcVUI->setVideoSignalTypePresentFlag(getVideoSignalTypePresentFlag());
817#endif
818    pcVUI->setVideoFormat(getVideoFormat());
819    pcVUI->setVideoFullRangeFlag(getVideoFullRangeFlag());
820    pcVUI->setColourDescriptionPresentFlag(getColourDescriptionPresentFlag());
821    pcVUI->setColourPrimaries(getColourPrimaries());
822    pcVUI->setTransferCharacteristics(getTransferCharacteristics());
823    pcVUI->setMatrixCoefficients(getMatrixCoefficients());
824    pcVUI->setChromaLocInfoPresentFlag(getChromaLocInfoPresentFlag());
825    pcVUI->setChromaSampleLocTypeTopField(getChromaSampleLocTypeTopField());
826    pcVUI->setChromaSampleLocTypeBottomField(getChromaSampleLocTypeBottomField());
827    pcVUI->setNeutralChromaIndicationFlag(getNeutralChromaIndicationFlag());
828    pcVUI->setDefaultDisplayWindow(getDefaultDisplayWindow());
829    pcVUI->setFrameFieldInfoPresentFlag(getFrameFieldInfoPresentFlag());
830    pcVUI->setFieldSeqFlag(false);
831    pcVUI->setHrdParametersPresentFlag(false);
832    pcVUI->getTimingInfo()->setPocProportionalToTimingFlag(getPocProportionalToTimingFlag());
833    pcVUI->getTimingInfo()->setNumTicksPocDiffOneMinus1   (getNumTicksPocDiffOneMinus1()   );
834    pcVUI->setBitstreamRestrictionFlag(getBitstreamRestrictionFlag());
835    pcVUI->setTilesFixedStructureFlag(getTilesFixedStructureFlag());
836    pcVUI->setMotionVectorsOverPicBoundariesFlag(getMotionVectorsOverPicBoundariesFlag());
837    pcVUI->setMinSpatialSegmentationIdc(getMinSpatialSegmentationIdc());
838    pcVUI->setMaxBytesPerPicDenom(getMaxBytesPerPicDenom());
839    pcVUI->setMaxBitsPerMinCuDenom(getMaxBitsPerMinCuDenom());
840    pcVUI->setLog2MaxMvLengthHorizontal(getLog2MaxMvLengthHorizontal());
841    pcVUI->setLog2MaxMvLengthVertical(getLog2MaxMvLengthVertical());
842  }
843}
844
845Void TEncTop::xInitPPS()
846{
847#if H_MV
848  m_cPPS.setLayerId( getLayerId() );
849  if( getVPS()->getNumDirectRefLayers( getLayerId() ) > 0 )
850  {
851    m_cPPS.setListsModificationPresentFlag( true );
852  }
853  m_cPPS.setPPSId( getLayerIdInVps() );
854  m_cPPS.setSPSId( getLayerIdInVps() );
855#if H_MV_HLS_8_SPS_NODOC_48
856  m_cPPS.setPpsMultilayerExtensionFlag    ( true ); 
857#if H_3D
858  m_cPPS.setPps3dExtensionFlag            ( true ); 
859#endif
860#else
861  m_cPPS.setPpsExtensionTypeFlag          ( PPS_EX_T_MV ,true ); 
862#if H_3D
863  m_cPPS.setPpsExtensionTypeFlag          ( PPS_EX_T_3D ,true ); 
864#endif
865#endif
866#endif
867
868#if H_3D
869  m_cPPS.setDLT( getDLT() );
870#endif
871  m_cPPS.setConstrainedIntraPred( m_bUseConstrainedIntraPred );
872  Bool bUseDQP = (getMaxCuDQPDepth() > 0)? true : false;
873
874      if((getMaxDeltaQP() != 0 )|| getUseAdaptiveQP())
875      {
876        bUseDQP = true;
877      }
878
879  if(bUseDQP)
880  {
881    m_cPPS.setUseDQP(true);
882    m_cPPS.setMaxCuDQPDepth( m_iMaxCuDQPDepth );
883    m_cPPS.setMinCuDQPSize( m_cPPS.getSPS()->getMaxCUWidth() >> ( m_cPPS.getMaxCuDQPDepth()) );
884  }
885  else
886  {
887    m_cPPS.setUseDQP(false);
888    m_cPPS.setMaxCuDQPDepth( 0 );
889    m_cPPS.setMinCuDQPSize( m_cPPS.getSPS()->getMaxCUWidth() >> ( m_cPPS.getMaxCuDQPDepth()) );
890  }
891
892  if ( m_RCEnableRateControl )
893  {
894    m_cPPS.setUseDQP(true);
895    m_cPPS.setMaxCuDQPDepth( 0 );
896    m_cPPS.setMinCuDQPSize( m_cPPS.getSPS()->getMaxCUWidth() >> ( m_cPPS.getMaxCuDQPDepth()) );
897  }
898
899  m_cPPS.setChromaCbQpOffset( m_chromaCbQpOffset );
900  m_cPPS.setChromaCrQpOffset( m_chromaCrQpOffset );
901
902  m_cPPS.setNumSubstreams(m_iWaveFrontSubstreams);
903  m_cPPS.setEntropyCodingSyncEnabledFlag( m_iWaveFrontSynchro > 0 );
904  m_cPPS.setTilesEnabledFlag( (m_iNumColumnsMinus1 > 0 || m_iNumRowsMinus1 > 0) );
905  m_cPPS.setUseWP( m_useWeightedPred );
906  m_cPPS.setWPBiPred( m_useWeightedBiPred );
907  m_cPPS.setOutputFlagPresentFlag( false );
908#if H_MV
909  m_cPPS.setNumExtraSliceHeaderBits( 3 ); 
910#endif
911  m_cPPS.setSignHideFlag(getSignHideFlag());
912  if ( getDeblockingFilterMetric() )
913  {
914    m_cPPS.setDeblockingFilterControlPresentFlag (true);
915    m_cPPS.setDeblockingFilterOverrideEnabledFlag(true);
916    m_cPPS.setPicDisableDeblockingFilterFlag(false);
917    m_cPPS.setDeblockingFilterBetaOffsetDiv2(0);
918    m_cPPS.setDeblockingFilterTcOffsetDiv2(0);
919  } 
920  else
921  {
922    m_cPPS.setDeblockingFilterControlPresentFlag (m_DeblockingFilterControlPresent );
923  }
924  m_cPPS.setLog2ParallelMergeLevelMinus2   (m_log2ParallelMergeLevelMinus2 );
925  m_cPPS.setCabacInitPresentFlag(CABAC_INIT_PRESENT_FLAG);
926  m_cPPS.setLoopFilterAcrossSlicesEnabledFlag( m_bLFCrossSliceBoundaryFlag );
927  Int histogram[MAX_NUM_REF + 1];
928  for( Int i = 0; i <= MAX_NUM_REF; i++ )
929  {
930    histogram[i]=0;
931  }
932  for( Int i = 0; i < getGOPSize(); i++ )
933  {
934    assert(getGOPEntry(i).m_numRefPicsActive >= 0 && getGOPEntry(i).m_numRefPicsActive <= MAX_NUM_REF);
935    histogram[getGOPEntry(i).m_numRefPicsActive]++;
936  }
937  Int maxHist=-1;
938  Int bestPos=0;
939  for( Int i = 0; i <= MAX_NUM_REF; i++ )
940  {
941    if(histogram[i]>maxHist)
942    {
943      maxHist=histogram[i];
944      bestPos=i;
945    }
946  }
947  assert(bestPos <= 15);
948  m_cPPS.setNumRefIdxL0DefaultActive(bestPos);
949  m_cPPS.setNumRefIdxL1DefaultActive(bestPos);
950  m_cPPS.setTransquantBypassEnableFlag(getTransquantBypassEnableFlag());
951  m_cPPS.setUseTransformSkip( m_useTransformSkip );
952  if (m_sliceSegmentMode)
953  {
954    m_cPPS.setDependentSliceSegmentsEnabledFlag( true );
955  }
956  if( m_cPPS.getDependentSliceSegmentsEnabledFlag() )
957  {
958    Int NumCtx = m_cPPS.getEntropyCodingSyncEnabledFlag()?2:1;
959    m_cSliceEncoder.initCtxMem( NumCtx );
960    for ( UInt st = 0; st < NumCtx; st++ )
961    {
962      TEncSbac* ctx = NULL;
963      ctx = new TEncSbac;
964      ctx->init( &m_cBinCoderCABAC );
965      m_cSliceEncoder.setCtxMem( ctx, st );
966    }
967  }
968}
969
970//Function for initializing m_RPSList, a list of TComReferencePictureSet, based on the GOPEntry objects read from the config file.
971Void TEncTop::xInitRPS(Bool isFieldCoding)
972{
973  TComReferencePictureSet*      rps;
974 
975  m_cSPS.createRPSList(getGOPSize()+m_extraRPSs+1);
976  TComRPSList* rpsList = m_cSPS.getRPSList();
977
978  for( Int i = 0; i < getGOPSize()+m_extraRPSs; i++) 
979  {
980    GOPEntry ge = getGOPEntry(i);
981    rps = rpsList->getReferencePictureSet(i);
982    rps->setNumberOfPictures(ge.m_numRefPics);
983    rps->setNumRefIdc(ge.m_numRefIdc);
984    Int numNeg = 0;
985    Int numPos = 0;
986    for( Int j = 0; j < ge.m_numRefPics; j++)
987    {
988      rps->setDeltaPOC(j,ge.m_referencePics[j]);
989      rps->setUsed(j,ge.m_usedByCurrPic[j]);
990      if(ge.m_referencePics[j]>0)
991      {
992        numPos++;
993      }
994      else
995      {
996        numNeg++;
997      }
998    }
999    rps->setNumberOfNegativePictures(numNeg);
1000    rps->setNumberOfPositivePictures(numPos);
1001
1002    // handle inter RPS intialization from the config file.
1003#if AUTO_INTER_RPS
1004    rps->setInterRPSPrediction(ge.m_interRPSPrediction > 0);  // not very clean, converting anything > 0 to true.
1005    rps->setDeltaRIdxMinus1(0);                               // index to the Reference RPS is always the previous one.
1006    TComReferencePictureSet*     RPSRef = rpsList->getReferencePictureSet(i-1);  // get the reference RPS
1007
1008    if (ge.m_interRPSPrediction == 2)  // Automatic generation of the inter RPS idc based on the RIdx provided.
1009    {
1010      Int deltaRPS = getGOPEntry(i-1).m_POC - ge.m_POC;  // the ref POC - current POC
1011      Int numRefDeltaPOC = RPSRef->getNumberOfPictures();
1012
1013      rps->setDeltaRPS(deltaRPS);           // set delta RPS
1014      rps->setNumRefIdc(numRefDeltaPOC+1);  // set the numRefIdc to the number of pictures in the reference RPS + 1.
1015      Int count=0;
1016      for (Int j = 0; j <= numRefDeltaPOC; j++ ) // cycle through pics in reference RPS.
1017      {
1018        Int RefDeltaPOC = (j<numRefDeltaPOC)? RPSRef->getDeltaPOC(j): 0;  // if it is the last decoded picture, set RefDeltaPOC = 0
1019        rps->setRefIdc(j, 0);
1020        for (Int k = 0; k < rps->getNumberOfPictures(); k++ )  // cycle through pics in current RPS.
1021        {
1022          if (rps->getDeltaPOC(k) == ( RefDeltaPOC + deltaRPS))  // if the current RPS has a same picture as the reference RPS.
1023          {
1024              rps->setRefIdc(j, (rps->getUsed(k)?1:2));
1025              count++;
1026              break;
1027          }
1028        }
1029      }
1030      if (count != rps->getNumberOfPictures())
1031      {
1032        printf("Warning: Unable fully predict all delta POCs using the reference RPS index given in the config file.  Setting Inter RPS to false for this RPS.\n");
1033        rps->setInterRPSPrediction(0);
1034      }
1035    }
1036    else if (ge.m_interRPSPrediction == 1)  // inter RPS idc based on the RefIdc values provided in config file.
1037    {
1038      rps->setDeltaRPS(ge.m_deltaRPS);
1039      rps->setNumRefIdc(ge.m_numRefIdc);
1040      for (Int j = 0; j < ge.m_numRefIdc; j++ )
1041      {
1042        rps->setRefIdc(j, ge.m_refIdc[j]);
1043      }
1044#if WRITE_BACK
1045      // the folowing code overwrite the deltaPOC and Used by current values read from the config file with the ones
1046      // computed from the RefIdc.  A warning is printed if they are not identical.
1047      numNeg = 0;
1048      numPos = 0;
1049      TComReferencePictureSet      RPSTemp;  // temporary variable
1050
1051      for (Int j = 0; j < ge.m_numRefIdc; j++ )
1052      {
1053        if (ge.m_refIdc[j])
1054        {
1055          Int deltaPOC = ge.m_deltaRPS + ((j < RPSRef->getNumberOfPictures())? RPSRef->getDeltaPOC(j) : 0);
1056          RPSTemp.setDeltaPOC((numNeg+numPos),deltaPOC);
1057          RPSTemp.setUsed((numNeg+numPos),ge.m_refIdc[j]==1?1:0);
1058          if (deltaPOC<0)
1059          {
1060            numNeg++;
1061          }
1062          else
1063          {
1064            numPos++;
1065          }
1066        }
1067      }
1068      if (numNeg != rps->getNumberOfNegativePictures())
1069      {
1070        printf("Warning: number of negative pictures in RPS is different between intra and inter RPS specified in the config file.\n");
1071        rps->setNumberOfNegativePictures(numNeg);
1072        rps->setNumberOfPictures(numNeg+numPos);
1073      }
1074      if (numPos != rps->getNumberOfPositivePictures())
1075      {
1076        printf("Warning: number of positive pictures in RPS is different between intra and inter RPS specified in the config file.\n");
1077        rps->setNumberOfPositivePictures(numPos);
1078        rps->setNumberOfPictures(numNeg+numPos);
1079      }
1080      RPSTemp.setNumberOfPictures(numNeg+numPos);
1081      RPSTemp.setNumberOfNegativePictures(numNeg);
1082      RPSTemp.sortDeltaPOC();     // sort the created delta POC before comparing
1083      // check if Delta POC and Used are the same
1084      // print warning if they are not.
1085      for (Int j = 0; j < ge.m_numRefIdc; j++ )
1086      {
1087        if (RPSTemp.getDeltaPOC(j) != rps->getDeltaPOC(j))
1088        {
1089          printf("Warning: delta POC is different between intra RPS and inter RPS specified in the config file.\n");
1090          rps->setDeltaPOC(j,RPSTemp.getDeltaPOC(j));
1091        }
1092        if (RPSTemp.getUsed(j) != rps->getUsed(j))
1093        {
1094          printf("Warning: Used by Current in RPS is different between intra and inter RPS specified in the config file.\n");
1095          rps->setUsed(j,RPSTemp.getUsed(j));
1096        }
1097      }
1098#endif
1099    }
1100#else
1101    rps->setInterRPSPrediction(ge.m_interRPSPrediction);
1102    if (ge.m_interRPSPrediction)
1103    {
1104      rps->setDeltaRIdxMinus1(0);
1105      rps->setDeltaRPS(ge.m_deltaRPS);
1106      rps->setNumRefIdc(ge.m_numRefIdc);
1107      for (Int j = 0; j < ge.m_numRefIdc; j++ )
1108      {
1109        rps->setRefIdc(j, ge.m_refIdc[j]);
1110      }
1111#if WRITE_BACK
1112      // the folowing code overwrite the deltaPOC and Used by current values read from the config file with the ones
1113      // computed from the RefIdc.  This is not necessary if both are identical. Currently there is no check to see if they are identical.
1114      numNeg = 0;
1115      numPos = 0;
1116      TComReferencePictureSet*     RPSRef = m_RPSList.getReferencePictureSet(i-1);
1117
1118      for (Int j = 0; j < ge.m_numRefIdc; j++ )
1119      {
1120        if (ge.m_refIdc[j])
1121        {
1122          Int deltaPOC = ge.m_deltaRPS + ((j < RPSRef->getNumberOfPictures())? RPSRef->getDeltaPOC(j) : 0);
1123          rps->setDeltaPOC((numNeg+numPos),deltaPOC);
1124          rps->setUsed((numNeg+numPos),ge.m_refIdc[j]==1?1:0);
1125          if (deltaPOC<0)
1126          {
1127            numNeg++;
1128          }
1129          else
1130          {
1131            numPos++;
1132          }
1133        }
1134      }
1135      rps->setNumberOfNegativePictures(numNeg);
1136      rps->setNumberOfPositivePictures(numPos);
1137      rps->sortDeltaPOC();
1138#endif
1139    }
1140#endif //INTER_RPS_AUTO
1141  }
1142  //In case of field coding, we need to set special parameters for the first bottom field of the sequence, since it is not specified in the cfg file.
1143  //The position = GOPSize + extraRPSs which is (a priori) unused is reserved for this field in the RPS.
1144  if (isFieldCoding) 
1145  {
1146    rps = rpsList->getReferencePictureSet(getGOPSize()+m_extraRPSs);
1147    rps->setNumberOfPictures(1);
1148    rps->setNumberOfNegativePictures(1);
1149    rps->setNumberOfPositivePictures(0);
1150    rps->setNumberOfLongtermPictures(0);
1151    rps->setDeltaPOC(0,-1);
1152    rps->setPOC(0,0);
1153    rps->setUsed(0,true);
1154    rps->setInterRPSPrediction(false);
1155    rps->setDeltaRIdxMinus1(0);
1156    rps->setDeltaRPS(0);
1157    rps->setNumRefIdc(0);
1158}
1159}
1160
1161   // This is a function that
1162   // determines what Reference Picture Set to use
1163   // for a specific slice (with POC = POCCurr)
1164Void TEncTop::selectReferencePictureSet(TComSlice* slice, Int POCCurr, Int GOPid )
1165{
1166#if H_MV
1167  if( slice->getRapPicFlag() == true && getLayerId() > 0 && POCCurr == 0 )
1168  {
1169    TComReferencePictureSet* rps = slice->getLocalRPS();
1170    rps->setNumberOfNegativePictures(0);
1171    rps->setNumberOfPositivePictures(0);
1172    rps->setNumberOfLongtermPictures(0);
1173    rps->setNumberOfPictures(0);
1174    slice->setRPS(rps);
1175  }
1176  else
1177  {
1178#endif
1179  slice->setRPSidx(GOPid);
1180
1181  for(Int extraNum=m_iGOPSize; extraNum<m_extraRPSs+m_iGOPSize; extraNum++)
1182  {   
1183    if(m_uiIntraPeriod > 0 && getDecodingRefreshType() > 0)
1184    {
1185      Int POCIndex = POCCurr%m_uiIntraPeriod;
1186      if(POCIndex == 0)
1187      {
1188        POCIndex = m_uiIntraPeriod;
1189      }
1190      if(POCIndex == m_GOPList[extraNum].m_POC)
1191      {
1192        slice->setRPSidx(extraNum);
1193      }
1194    }
1195    else
1196    {
1197      if(POCCurr==m_GOPList[extraNum].m_POC)
1198      {
1199        slice->setRPSidx(extraNum);
1200      }
1201    }
1202  }
1203  if(POCCurr == 1 && slice->getPic()->isField())
1204  {
1205    slice->setRPSidx(m_iGOPSize+m_extraRPSs);
1206  }
1207
1208  slice->setRPS(getSPS()->getRPSList()->getReferencePictureSet(slice->getRPSidx()));
1209  slice->getRPS()->setNumberOfPictures(slice->getRPS()->getNumberOfNegativePictures()+slice->getRPS()->getNumberOfPositivePictures());
1210#if H_MV
1211  }
1212#endif
1213
1214}
1215
1216Int TEncTop::getReferencePictureSetIdxForSOP(TComSlice* slice, Int POCCurr, Int GOPid )
1217{
1218  int rpsIdx = GOPid;
1219
1220  for(Int extraNum=m_iGOPSize; extraNum<m_extraRPSs+m_iGOPSize; extraNum++)
1221  {   
1222    if(m_uiIntraPeriod > 0 && getDecodingRefreshType() > 0)
1223    {
1224      Int POCIndex = POCCurr%m_uiIntraPeriod;
1225      if(POCIndex == 0)
1226      {
1227        POCIndex = m_uiIntraPeriod;
1228      }
1229      if(POCIndex == m_GOPList[extraNum].m_POC)
1230      {
1231        rpsIdx = extraNum;
1232      }
1233    }
1234    else
1235    {
1236      if(POCCurr==m_GOPList[extraNum].m_POC)
1237      {
1238        rpsIdx = extraNum;
1239      }
1240    }
1241  }
1242
1243  return rpsIdx;
1244}
1245
1246Void  TEncTop::xInitPPSforTiles()
1247{
1248  m_cPPS.setUniformSpacingFlag( m_iUniformSpacingIdr );
1249  m_cPPS.setNumColumnsMinus1( m_iNumColumnsMinus1 );
1250  m_cPPS.setNumRowsMinus1( m_iNumRowsMinus1 );
1251  if( m_iUniformSpacingIdr == 0 )
1252  {
1253    m_cPPS.setColumnWidth( m_puiColumnWidth );
1254    m_cPPS.setRowHeight( m_puiRowHeight );
1255  }
1256  m_cPPS.setLoopFilterAcrossTilesEnabledFlag( m_loopFilterAcrossTilesEnabledFlag );
1257
1258  // # substreams is "per tile" when tiles are independent.
1259  if (m_iWaveFrontSynchro
1260    )
1261  {
1262    m_cPPS.setNumSubstreams(m_iWaveFrontSubstreams * (m_iNumColumnsMinus1+1));
1263  }
1264}
1265
1266Void  TEncCfg::xCheckGSParameters()
1267{
1268  Int   iWidthInCU = ( m_iSourceWidth%g_uiMaxCUWidth ) ? m_iSourceWidth/g_uiMaxCUWidth + 1 : m_iSourceWidth/g_uiMaxCUWidth;
1269  Int   iHeightInCU = ( m_iSourceHeight%g_uiMaxCUHeight ) ? m_iSourceHeight/g_uiMaxCUHeight + 1 : m_iSourceHeight/g_uiMaxCUHeight;
1270  UInt  uiCummulativeColumnWidth = 0;
1271  UInt  uiCummulativeRowHeight = 0;
1272
1273  //check the column relative parameters
1274  if( m_iNumColumnsMinus1 >= (1<<(LOG2_MAX_NUM_COLUMNS_MINUS1+1)) )
1275  {
1276    printf( "The number of columns is larger than the maximum allowed number of columns.\n" );
1277    exit( EXIT_FAILURE );
1278  }
1279
1280  if( m_iNumColumnsMinus1 >= iWidthInCU )
1281  {
1282    printf( "The current picture can not have so many columns.\n" );
1283    exit( EXIT_FAILURE );
1284  }
1285
1286  if( m_iNumColumnsMinus1 && m_iUniformSpacingIdr==0 )
1287  {
1288    for(Int i=0; i<m_iNumColumnsMinus1; i++)
1289    {
1290      uiCummulativeColumnWidth += m_puiColumnWidth[i];
1291    }
1292
1293    if( uiCummulativeColumnWidth >= iWidthInCU )
1294    {
1295      printf( "The width of the column is too large.\n" );
1296      exit( EXIT_FAILURE );
1297    }
1298  }
1299
1300  //check the row relative parameters
1301  if( m_iNumRowsMinus1 >= (1<<(LOG2_MAX_NUM_ROWS_MINUS1+1)) )
1302  {
1303    printf( "The number of rows is larger than the maximum allowed number of rows.\n" );
1304    exit( EXIT_FAILURE );
1305  }
1306
1307  if( m_iNumRowsMinus1 >= iHeightInCU )
1308  {
1309    printf( "The current picture can not have so many rows.\n" );
1310    exit( EXIT_FAILURE );
1311  }
1312
1313  if( m_iNumRowsMinus1 && m_iUniformSpacingIdr==0 )
1314  {
1315    for(Int i=0; i<m_iNumRowsMinus1; i++)
1316      uiCummulativeRowHeight += m_puiRowHeight[i];
1317
1318    if( uiCummulativeRowHeight >= iHeightInCU )
1319    {
1320      printf( "The height of the row is too large.\n" );
1321      exit( EXIT_FAILURE );
1322    }
1323  }
1324}
1325#if H_MV
1326Void TEncTop::printSummary( Int numAllPicCoded, Bool isField )
1327{
1328  assert ( !isField ); // Multiview and field coding need to be further unified
1329  assert (numAllPicCoded == m_cAnalyzeAll.getNumPic());
1330
1331  //--CFG_KDY
1332  m_cAnalyzeAll.setFrmRate( getFrameRate() );
1333  m_cAnalyzeI.setFrmRate( getFrameRate() );
1334  m_cAnalyzeP.setFrmRate( getFrameRate() );
1335  m_cAnalyzeB.setFrmRate( getFrameRate() );
1336
1337  //-- all
1338  printf( "\n\nSUMMARY ------------------------------------------- LayerId %2d\n", m_layerId );
1339
1340  m_cAnalyzeAll.printOut('a');
1341
1342  printf( "\n\nI Slices--------------------------------------------------------\n" );
1343  m_cAnalyzeI.printOut('i');
1344
1345  printf( "\n\nP Slices--------------------------------------------------------\n" );
1346  m_cAnalyzeP.printOut('p');
1347
1348  printf( "\n\nB Slices--------------------------------------------------------\n" );
1349  m_cAnalyzeB.printOut('b');
1350
1351#if _SUMMARY_OUT_
1352  m_cAnalyzeAll.printSummaryOut();
1353#endif
1354#if _SUMMARY_PIC_
1355  m_cAnalyzeI.printSummary('I');
1356  m_cAnalyzeP.printSummary('P');
1357  m_cAnalyzeB.printSummary('B');
1358#endif
1359}
1360
1361Int TEncTop::getFrameId(Int iGOPid) 
1362{
1363  if(m_iPOCLast == 0)
1364  {
1365    return(0 );
1366  }
1367  else
1368  {
1369    return m_iPOCLast -m_iNumPicRcvd+ getGOPEntry(iGOPid).m_POC ;
1370  }
1371}
1372
1373TComPic* TEncTop::getPic( Int poc )
1374{
1375  TComList<TComPic*>* listPic = getListPic();
1376  TComPic* pcPic = NULL;
1377  for(TComList<TComPic*>::iterator it=listPic->begin(); it!=listPic->end(); it++)
1378  {
1379    if( (*it)->getPOC() == poc )
1380    {
1381      pcPic = *it ;
1382      break ;
1383    }
1384  }
1385  return pcPic;
1386}
1387#endif
1388
1389#if H_3D_VSO
1390Void TEncTop::setupRenModel( Int iPoc, Int iEncViewIdx, Int iEncContent, Int iHorOffset )
1391{
1392  TRenModel* rendererModel = m_cRdCost.getRenModel(); 
1393  rendererModel->setupPart( iHorOffset, std::min( (Int) g_uiMaxCUHeight, (Int) ( m_iSourceHeight - iHorOffset ) )) ; 
1394 
1395  Int iEncViewSIdx = m_cameraParameters->getBaseId2SortedId()[ iEncViewIdx ];
1396
1397  // setup base views
1398  Int iNumOfBV = m_renderModelParameters->getNumOfBaseViewsForView( iEncViewSIdx, iEncContent );
1399
1400  for (Int iCurView = 0; iCurView < iNumOfBV; iCurView++ )
1401  {
1402    Int iBaseViewSIdx;
1403    Int iVideoDistMode;
1404    Int iDepthDistMode;
1405
1406    m_renderModelParameters->getBaseViewData( iEncViewSIdx, iEncContent, iCurView, iBaseViewSIdx, iVideoDistMode, iDepthDistMode );
1407
1408    AOT( iVideoDistMode < 0 || iVideoDistMode > 2 );
1409
1410    Int iBaseViewIdx = m_cameraParameters->getBaseSortedId2Id()[ iBaseViewSIdx ];
1411
1412    TComPicYuv* pcPicYuvVideoRec  = m_ivPicLists->getPicYuv( iBaseViewIdx, false, iPoc, true  );
1413    TComPicYuv* pcPicYuvDepthRec  = m_ivPicLists->getPicYuv( iBaseViewIdx, true , iPoc, true  );
1414    TComPicYuv* pcPicYuvVideoOrg  = m_ivPicLists->getPicYuv( iBaseViewIdx, false, iPoc, false );
1415    TComPicYuv* pcPicYuvDepthOrg  = m_ivPicLists->getPicYuv( iBaseViewIdx, true , iPoc, false );   
1416
1417    TComPicYuv* pcPicYuvVideoRef  = ( iVideoDistMode == 2 ) ? pcPicYuvVideoOrg  : NULL;
1418    TComPicYuv* pcPicYuvDepthRef  = ( iDepthDistMode == 2 ) ? pcPicYuvDepthOrg  : NULL;
1419
1420    TComPicYuv* pcPicYuvVideoTest = ( iVideoDistMode == 0 ) ? pcPicYuvVideoOrg  : pcPicYuvVideoRec;
1421    TComPicYuv* pcPicYuvDepthTest = ( iDepthDistMode == 0 ) ? pcPicYuvDepthOrg  : pcPicYuvDepthRec;
1422
1423    AOT( (iVideoDistMode == 2) != (pcPicYuvVideoRef != NULL) );
1424    AOT( (iDepthDistMode == 2) != (pcPicYuvDepthRef != NULL) );
1425    AOT( pcPicYuvDepthTest == NULL );
1426    AOT( pcPicYuvVideoTest == NULL );
1427
1428    rendererModel->setBaseView( iBaseViewSIdx, pcPicYuvVideoTest, pcPicYuvDepthTest, pcPicYuvVideoRef, pcPicYuvDepthRef );
1429  }
1430
1431  rendererModel->setErrorMode( iEncViewSIdx, iEncContent, 0 );
1432  // setup virtual views
1433  Int iNumOfSV  = m_renderModelParameters->getNumOfModelsForView( iEncViewSIdx, iEncContent );
1434  for (Int iCurView = 0; iCurView < iNumOfSV; iCurView++ )
1435  {
1436    Int iOrgRefBaseViewSIdx;
1437    Int iLeftBaseViewSIdx;
1438    Int iRightBaseViewSIdx;
1439    Int iSynthViewRelNum;
1440    Int iModelNum;
1441    Int iBlendMode;
1442    m_renderModelParameters->getSingleModelData(iEncViewSIdx, iEncContent, iCurView, iModelNum, iBlendMode,iLeftBaseViewSIdx, iRightBaseViewSIdx, iOrgRefBaseViewSIdx, iSynthViewRelNum );
1443
1444    Int iLeftBaseViewIdx    = -1;
1445    Int iRightBaseViewIdx   = -1;
1446
1447    TComPicYuv* pcPicYuvOrgRef  = NULL;
1448    Int**      ppiShiftLUTLeft  = NULL;
1449    Int**      ppiShiftLUTRight = NULL;
1450    Int**      ppiBaseShiftLUTLeft  = NULL;
1451    Int**      ppiBaseShiftLUTRight = NULL;
1452
1453
1454    Int        iDistToLeft      = -1;
1455
1456    Int iSynthViewIdx = m_cameraParameters->synthRelNum2Idx( iSynthViewRelNum );
1457
1458    if ( iLeftBaseViewSIdx != -1 )
1459    {
1460      iLeftBaseViewIdx   = m_cameraParameters->getBaseSortedId2Id()   [ iLeftBaseViewSIdx ];
1461      ppiShiftLUTLeft    = m_cameraParameters->getSynthViewShiftLUTI()[ iLeftBaseViewIdx  ][ iSynthViewIdx  ];
1462    }
1463
1464    if ( iRightBaseViewSIdx != -1 )
1465    {
1466      iRightBaseViewIdx  = m_cameraParameters->getBaseSortedId2Id()   [iRightBaseViewSIdx ];
1467      ppiShiftLUTRight   = m_cameraParameters->getSynthViewShiftLUTI()[ iRightBaseViewIdx ][ iSynthViewIdx ];
1468    }
1469
1470    if ( iRightBaseViewSIdx != -1 && iLeftBaseViewSIdx != -1 )
1471    {
1472      iDistToLeft          = m_cameraParameters->getRelDistLeft(  iSynthViewIdx , iLeftBaseViewIdx, iRightBaseViewIdx);
1473      ppiBaseShiftLUTLeft  = m_cameraParameters->getBaseViewShiftLUTI() [ iLeftBaseViewIdx  ][ iRightBaseViewIdx ];
1474      ppiBaseShiftLUTRight = m_cameraParameters->getBaseViewShiftLUTI() [ iRightBaseViewIdx ][ iLeftBaseViewIdx  ];
1475
1476    }
1477
1478    if ( iOrgRefBaseViewSIdx != -1 )
1479    {
1480      pcPicYuvOrgRef = m_ivPicLists->getPicYuv(  m_cameraParameters->getBaseSortedId2Id()[ iOrgRefBaseViewSIdx ] , false, iPoc, false );
1481      AOF ( pcPicYuvOrgRef );
1482    }
1483
1484    rendererModel->setSingleModel( iModelNum, ppiShiftLUTLeft, ppiBaseShiftLUTLeft, ppiShiftLUTRight, ppiBaseShiftLUTRight, iDistToLeft, pcPicYuvOrgRef );
1485  }
1486}
1487#endif
1488//! \}
Note: See TracBrowser for help on using the repository browser.