source: 3DVCSoftware/trunk/source/Lib/TLibEncoder/TEncTop.cpp @ 738

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

Merged HTM-9.0-dev0@731. (MV-HEVC 6 HLS)

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