source: 3DVCSoftware/branches/HTM-11.2-dev2-MediaTek/source/Lib/TLibEncoder/TEncTop.cpp @ 1007

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

JCT3V-I0099. Changes of sub-PU size signaling and lim_qt_pred_flag signaling in VPS extension 2. Remove use_qtl_flag and use_pc_flag.

  • Property svn:eol-style set to native
File size: 47.8 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  m_cSPS.setSpsMultilayerExtensionFlag    ( true ); 
701#if H_3D
702  m_cSPS.setSps3dExtensionFlag            ( true ); 
703#endif
704#endif
705  m_cSPS.setPicWidthInLumaSamples         ( m_iSourceWidth      );
706  m_cSPS.setPicHeightInLumaSamples        ( m_iSourceHeight     );
707  m_cSPS.setConformanceWindow             ( m_conformanceWindow );
708  m_cSPS.setMaxCUWidth    ( g_uiMaxCUWidth      );
709  m_cSPS.setMaxCUHeight   ( g_uiMaxCUHeight     );
710  m_cSPS.setMaxCUDepth    ( g_uiMaxCUDepth      );
711
712  Int minCUSize = m_cSPS.getMaxCUWidth() >> ( m_cSPS.getMaxCUDepth()-g_uiAddCUDepth );
713  Int log2MinCUSize = 0;
714  while(minCUSize > 1)
715  {
716    minCUSize >>= 1;
717    log2MinCUSize++;
718  }
719
720  m_cSPS.setLog2MinCodingBlockSize(log2MinCUSize);
721  m_cSPS.setLog2DiffMaxMinCodingBlockSize(m_cSPS.getMaxCUDepth()-g_uiAddCUDepth);
722 
723  m_cSPS.setPCMLog2MinSize (m_uiPCMLog2MinSize);
724  m_cSPS.setUsePCM        ( m_usePCM           );
725  m_cSPS.setPCMLog2MaxSize( m_pcmLog2MaxSize  );
726
727  m_cSPS.setQuadtreeTULog2MaxSize( m_uiQuadtreeTULog2MaxSize );
728  m_cSPS.setQuadtreeTULog2MinSize( m_uiQuadtreeTULog2MinSize );
729  m_cSPS.setQuadtreeTUMaxDepthInter( m_uiQuadtreeTUMaxDepthInter    );
730  m_cSPS.setQuadtreeTUMaxDepthIntra( m_uiQuadtreeTUMaxDepthIntra    );
731 
732  m_cSPS.setTMVPFlagsPresent(false);
733
734  m_cSPS.setMaxTrSize   ( 1 << m_uiQuadtreeTULog2MaxSize );
735 
736  Int i;
737 
738  for (i = 0; i < g_uiMaxCUDepth-g_uiAddCUDepth; i++ )
739  {
740    m_cSPS.setAMPAcc( i, m_useAMP );
741    //m_cSPS.setAMPAcc( i, 1 );
742  }
743
744  m_cSPS.setUseAMP ( m_useAMP );
745
746#if !MTK_I0099_VPS_EX2
747#if H_3D_QTLPC
748  m_cSPS.setUseQTL( m_bUseQTL );
749  m_cSPS.setUsePC ( m_bUsePC  );
750#endif
751#endif
752
753  for (i = g_uiMaxCUDepth-g_uiAddCUDepth; i < g_uiMaxCUDepth; i++ )
754  {
755    m_cSPS.setAMPAcc(i, 0);
756  }
757
758  m_cSPS.setBitDepthY( g_bitDepthY );
759  m_cSPS.setBitDepthC( g_bitDepthC );
760
761  m_cSPS.setQpBDOffsetY ( 6*(g_bitDepthY - 8) );
762  m_cSPS.setQpBDOffsetC ( 6*(g_bitDepthC - 8) );
763
764  m_cSPS.setUseSAO( m_bUseSAO );
765
766  m_cSPS.setMaxTLayers( m_maxTempLayer );
767  m_cSPS.setTemporalIdNestingFlag( ( m_maxTempLayer == 1 ) ? true : false );
768  for ( i = 0; i < min(m_cSPS.getMaxTLayers(),(UInt) MAX_TLAYER); i++ )
769  {
770    m_cSPS.setMaxDecPicBuffering(m_maxDecPicBuffering[i], i);
771    m_cSPS.setNumReorderPics(m_numReorderPics[i], i);
772  }
773#if H_MV
774  for ( Int ols = 0; ols < m_cVPS->getNumOutputLayerSets(); ols++)
775  {
776    // Check MaxDecPicBuffering
777    const std::vector<Int>& targetDecLayerIdList = m_cVPS->getTargetDecLayerIdList( m_cVPS->olsIdxToLsIdx( ols )); 
778    for( Int is = 0; is < targetDecLayerIdList.size(); is++  )
779    {
780      m_cSPS.inferSpsMaxDecPicBufferingMinus1( m_cVPS, ols, targetDecLayerIdList[is], true );       
781    }
782  }
783
784  m_cVPS->inferDbpSizeLayerSetZero( &m_cSPS, true ); 
785#endif
786  m_cSPS.setPCMBitDepthLuma (g_uiPCMBitDepthLuma);
787  m_cSPS.setPCMBitDepthChroma (g_uiPCMBitDepthChroma);
788  m_cSPS.setPCMFilterDisableFlag  ( m_bPCMFilterDisableFlag );
789
790  m_cSPS.setScalingListFlag ( (m_useScalingListId == 0) ? 0 : 1 );
791
792  m_cSPS.setUseStrongIntraSmoothing( m_useStrongIntraSmoothing );
793
794  m_cSPS.setVuiParametersPresentFlag(getVuiParametersPresentFlag());
795  if (m_cSPS.getVuiParametersPresentFlag())
796  {
797    TComVUI* pcVUI = m_cSPS.getVuiParameters();
798    pcVUI->setAspectRatioInfoPresentFlag(getAspectRatioIdc() != -1);
799    pcVUI->setAspectRatioIdc(getAspectRatioIdc());
800    pcVUI->setSarWidth(getSarWidth());
801    pcVUI->setSarHeight(getSarHeight());
802    pcVUI->setOverscanInfoPresentFlag(getOverscanInfoPresentFlag());
803    pcVUI->setOverscanAppropriateFlag(getOverscanAppropriateFlag());
804#if H_MV
805    pcVUI->setVideoSignalTypePresentFlag(getVideoSignalTypePresentFlag() && getLayerId() == 0 );
806#else
807   pcVUI->setVideoSignalTypePresentFlag(getVideoSignalTypePresentFlag());
808#endif
809    pcVUI->setVideoFormat(getVideoFormat());
810    pcVUI->setVideoFullRangeFlag(getVideoFullRangeFlag());
811    pcVUI->setColourDescriptionPresentFlag(getColourDescriptionPresentFlag());
812    pcVUI->setColourPrimaries(getColourPrimaries());
813    pcVUI->setTransferCharacteristics(getTransferCharacteristics());
814    pcVUI->setMatrixCoefficients(getMatrixCoefficients());
815    pcVUI->setChromaLocInfoPresentFlag(getChromaLocInfoPresentFlag());
816    pcVUI->setChromaSampleLocTypeTopField(getChromaSampleLocTypeTopField());
817    pcVUI->setChromaSampleLocTypeBottomField(getChromaSampleLocTypeBottomField());
818    pcVUI->setNeutralChromaIndicationFlag(getNeutralChromaIndicationFlag());
819    pcVUI->setDefaultDisplayWindow(getDefaultDisplayWindow());
820    pcVUI->setFrameFieldInfoPresentFlag(getFrameFieldInfoPresentFlag());
821    pcVUI->setFieldSeqFlag(false);
822    pcVUI->setHrdParametersPresentFlag(false);
823    pcVUI->getTimingInfo()->setPocProportionalToTimingFlag(getPocProportionalToTimingFlag());
824    pcVUI->getTimingInfo()->setNumTicksPocDiffOneMinus1   (getNumTicksPocDiffOneMinus1()   );
825    pcVUI->setBitstreamRestrictionFlag(getBitstreamRestrictionFlag());
826    pcVUI->setTilesFixedStructureFlag(getTilesFixedStructureFlag());
827    pcVUI->setMotionVectorsOverPicBoundariesFlag(getMotionVectorsOverPicBoundariesFlag());
828    pcVUI->setMinSpatialSegmentationIdc(getMinSpatialSegmentationIdc());
829    pcVUI->setMaxBytesPerPicDenom(getMaxBytesPerPicDenom());
830    pcVUI->setMaxBitsPerMinCuDenom(getMaxBitsPerMinCuDenom());
831    pcVUI->setLog2MaxMvLengthHorizontal(getLog2MaxMvLengthHorizontal());
832    pcVUI->setLog2MaxMvLengthVertical(getLog2MaxMvLengthVertical());
833  }
834}
835
836Void TEncTop::xInitPPS()
837{
838#if H_MV
839  m_cPPS.setLayerId( getLayerId() );
840  if( getVPS()->getNumDirectRefLayers( getLayerId() ) > 0 )
841  {
842    m_cPPS.setListsModificationPresentFlag( true );
843  }
844  m_cPPS.setPPSId( getLayerIdInVps() );
845  m_cPPS.setSPSId( getLayerIdInVps() );
846  m_cPPS.setPpsMultilayerExtensionFlag    ( true ); 
847#if H_3D
848  m_cPPS.setPps3dExtensionFlag            ( true ); 
849#endif
850#endif
851
852#if H_3D
853  m_cPPS.setDLT( getDLT() );
854#endif
855  m_cPPS.setConstrainedIntraPred( m_bUseConstrainedIntraPred );
856  Bool bUseDQP = (getMaxCuDQPDepth() > 0)? true : false;
857
858      if((getMaxDeltaQP() != 0 )|| getUseAdaptiveQP())
859      {
860        bUseDQP = true;
861      }
862
863  if(bUseDQP)
864  {
865    m_cPPS.setUseDQP(true);
866    m_cPPS.setMaxCuDQPDepth( m_iMaxCuDQPDepth );
867    m_cPPS.setMinCuDQPSize( m_cPPS.getSPS()->getMaxCUWidth() >> ( m_cPPS.getMaxCuDQPDepth()) );
868  }
869  else
870  {
871    m_cPPS.setUseDQP(false);
872    m_cPPS.setMaxCuDQPDepth( 0 );
873    m_cPPS.setMinCuDQPSize( m_cPPS.getSPS()->getMaxCUWidth() >> ( m_cPPS.getMaxCuDQPDepth()) );
874  }
875
876  if ( m_RCEnableRateControl )
877  {
878    m_cPPS.setUseDQP(true);
879    m_cPPS.setMaxCuDQPDepth( 0 );
880    m_cPPS.setMinCuDQPSize( m_cPPS.getSPS()->getMaxCUWidth() >> ( m_cPPS.getMaxCuDQPDepth()) );
881  }
882
883  m_cPPS.setChromaCbQpOffset( m_chromaCbQpOffset );
884  m_cPPS.setChromaCrQpOffset( m_chromaCrQpOffset );
885
886  m_cPPS.setNumSubstreams(m_iWaveFrontSubstreams);
887  m_cPPS.setEntropyCodingSyncEnabledFlag( m_iWaveFrontSynchro > 0 );
888  m_cPPS.setTilesEnabledFlag( (m_iNumColumnsMinus1 > 0 || m_iNumRowsMinus1 > 0) );
889  m_cPPS.setUseWP( m_useWeightedPred );
890  m_cPPS.setWPBiPred( m_useWeightedBiPred );
891  m_cPPS.setOutputFlagPresentFlag( false );
892#if H_MV
893  m_cPPS.setNumExtraSliceHeaderBits( 3 ); 
894#endif
895  m_cPPS.setSignHideFlag(getSignHideFlag());
896  if ( getDeblockingFilterMetric() )
897  {
898    m_cPPS.setDeblockingFilterControlPresentFlag (true);
899    m_cPPS.setDeblockingFilterOverrideEnabledFlag(true);
900    m_cPPS.setPicDisableDeblockingFilterFlag(false);
901    m_cPPS.setDeblockingFilterBetaOffsetDiv2(0);
902    m_cPPS.setDeblockingFilterTcOffsetDiv2(0);
903  } 
904  else
905  {
906    m_cPPS.setDeblockingFilterControlPresentFlag (m_DeblockingFilterControlPresent );
907  }
908  m_cPPS.setLog2ParallelMergeLevelMinus2   (m_log2ParallelMergeLevelMinus2 );
909  m_cPPS.setCabacInitPresentFlag(CABAC_INIT_PRESENT_FLAG);
910  m_cPPS.setLoopFilterAcrossSlicesEnabledFlag( m_bLFCrossSliceBoundaryFlag );
911  Int histogram[MAX_NUM_REF + 1];
912  for( Int i = 0; i <= MAX_NUM_REF; i++ )
913  {
914    histogram[i]=0;
915  }
916  for( Int i = 0; i < getGOPSize(); i++ )
917  {
918    assert(getGOPEntry(i).m_numRefPicsActive >= 0 && getGOPEntry(i).m_numRefPicsActive <= MAX_NUM_REF);
919    histogram[getGOPEntry(i).m_numRefPicsActive]++;
920  }
921  Int maxHist=-1;
922  Int bestPos=0;
923  for( Int i = 0; i <= MAX_NUM_REF; i++ )
924  {
925    if(histogram[i]>maxHist)
926    {
927      maxHist=histogram[i];
928      bestPos=i;
929    }
930  }
931  assert(bestPos <= 15);
932  m_cPPS.setNumRefIdxL0DefaultActive(bestPos);
933  m_cPPS.setNumRefIdxL1DefaultActive(bestPos);
934  m_cPPS.setTransquantBypassEnableFlag(getTransquantBypassEnableFlag());
935  m_cPPS.setUseTransformSkip( m_useTransformSkip );
936  if (m_sliceSegmentMode)
937  {
938    m_cPPS.setDependentSliceSegmentsEnabledFlag( true );
939  }
940  if( m_cPPS.getDependentSliceSegmentsEnabledFlag() )
941  {
942    Int NumCtx = m_cPPS.getEntropyCodingSyncEnabledFlag()?2:1;
943    m_cSliceEncoder.initCtxMem( NumCtx );
944    for ( UInt st = 0; st < NumCtx; st++ )
945    {
946      TEncSbac* ctx = NULL;
947      ctx = new TEncSbac;
948      ctx->init( &m_cBinCoderCABAC );
949      m_cSliceEncoder.setCtxMem( ctx, st );
950    }
951  }
952}
953
954//Function for initializing m_RPSList, a list of TComReferencePictureSet, based on the GOPEntry objects read from the config file.
955Void TEncTop::xInitRPS(Bool isFieldCoding)
956{
957  TComReferencePictureSet*      rps;
958 
959  m_cSPS.createRPSList(getGOPSize()+m_extraRPSs+1);
960  TComRPSList* rpsList = m_cSPS.getRPSList();
961
962  for( Int i = 0; i < getGOPSize()+m_extraRPSs; i++) 
963  {
964    GOPEntry ge = getGOPEntry(i);
965    rps = rpsList->getReferencePictureSet(i);
966    rps->setNumberOfPictures(ge.m_numRefPics);
967    rps->setNumRefIdc(ge.m_numRefIdc);
968    Int numNeg = 0;
969    Int numPos = 0;
970    for( Int j = 0; j < ge.m_numRefPics; j++)
971    {
972      rps->setDeltaPOC(j,ge.m_referencePics[j]);
973      rps->setUsed(j,ge.m_usedByCurrPic[j]);
974      if(ge.m_referencePics[j]>0)
975      {
976        numPos++;
977      }
978      else
979      {
980        numNeg++;
981      }
982    }
983    rps->setNumberOfNegativePictures(numNeg);
984    rps->setNumberOfPositivePictures(numPos);
985
986    // handle inter RPS intialization from the config file.
987#if AUTO_INTER_RPS
988    rps->setInterRPSPrediction(ge.m_interRPSPrediction > 0);  // not very clean, converting anything > 0 to true.
989    rps->setDeltaRIdxMinus1(0);                               // index to the Reference RPS is always the previous one.
990    TComReferencePictureSet*     RPSRef = rpsList->getReferencePictureSet(i-1);  // get the reference RPS
991
992    if (ge.m_interRPSPrediction == 2)  // Automatic generation of the inter RPS idc based on the RIdx provided.
993    {
994      Int deltaRPS = getGOPEntry(i-1).m_POC - ge.m_POC;  // the ref POC - current POC
995      Int numRefDeltaPOC = RPSRef->getNumberOfPictures();
996
997      rps->setDeltaRPS(deltaRPS);           // set delta RPS
998      rps->setNumRefIdc(numRefDeltaPOC+1);  // set the numRefIdc to the number of pictures in the reference RPS + 1.
999      Int count=0;
1000      for (Int j = 0; j <= numRefDeltaPOC; j++ ) // cycle through pics in reference RPS.
1001      {
1002        Int RefDeltaPOC = (j<numRefDeltaPOC)? RPSRef->getDeltaPOC(j): 0;  // if it is the last decoded picture, set RefDeltaPOC = 0
1003        rps->setRefIdc(j, 0);
1004        for (Int k = 0; k < rps->getNumberOfPictures(); k++ )  // cycle through pics in current RPS.
1005        {
1006          if (rps->getDeltaPOC(k) == ( RefDeltaPOC + deltaRPS))  // if the current RPS has a same picture as the reference RPS.
1007          {
1008              rps->setRefIdc(j, (rps->getUsed(k)?1:2));
1009              count++;
1010              break;
1011          }
1012        }
1013      }
1014      if (count != rps->getNumberOfPictures())
1015      {
1016        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");
1017        rps->setInterRPSPrediction(0);
1018      }
1019    }
1020    else if (ge.m_interRPSPrediction == 1)  // inter RPS idc based on the RefIdc values provided in config file.
1021    {
1022      rps->setDeltaRPS(ge.m_deltaRPS);
1023      rps->setNumRefIdc(ge.m_numRefIdc);
1024      for (Int j = 0; j < ge.m_numRefIdc; j++ )
1025      {
1026        rps->setRefIdc(j, ge.m_refIdc[j]);
1027      }
1028#if WRITE_BACK
1029      // the folowing code overwrite the deltaPOC and Used by current values read from the config file with the ones
1030      // computed from the RefIdc.  A warning is printed if they are not identical.
1031      numNeg = 0;
1032      numPos = 0;
1033      TComReferencePictureSet      RPSTemp;  // temporary variable
1034
1035      for (Int j = 0; j < ge.m_numRefIdc; j++ )
1036      {
1037        if (ge.m_refIdc[j])
1038        {
1039          Int deltaPOC = ge.m_deltaRPS + ((j < RPSRef->getNumberOfPictures())? RPSRef->getDeltaPOC(j) : 0);
1040          RPSTemp.setDeltaPOC((numNeg+numPos),deltaPOC);
1041          RPSTemp.setUsed((numNeg+numPos),ge.m_refIdc[j]==1?1:0);
1042          if (deltaPOC<0)
1043          {
1044            numNeg++;
1045          }
1046          else
1047          {
1048            numPos++;
1049          }
1050        }
1051      }
1052      if (numNeg != rps->getNumberOfNegativePictures())
1053      {
1054        printf("Warning: number of negative pictures in RPS is different between intra and inter RPS specified in the config file.\n");
1055        rps->setNumberOfNegativePictures(numNeg);
1056        rps->setNumberOfPictures(numNeg+numPos);
1057      }
1058      if (numPos != rps->getNumberOfPositivePictures())
1059      {
1060        printf("Warning: number of positive pictures in RPS is different between intra and inter RPS specified in the config file.\n");
1061        rps->setNumberOfPositivePictures(numPos);
1062        rps->setNumberOfPictures(numNeg+numPos);
1063      }
1064      RPSTemp.setNumberOfPictures(numNeg+numPos);
1065      RPSTemp.setNumberOfNegativePictures(numNeg);
1066      RPSTemp.sortDeltaPOC();     // sort the created delta POC before comparing
1067      // check if Delta POC and Used are the same
1068      // print warning if they are not.
1069      for (Int j = 0; j < ge.m_numRefIdc; j++ )
1070      {
1071        if (RPSTemp.getDeltaPOC(j) != rps->getDeltaPOC(j))
1072        {
1073          printf("Warning: delta POC is different between intra RPS and inter RPS specified in the config file.\n");
1074          rps->setDeltaPOC(j,RPSTemp.getDeltaPOC(j));
1075        }
1076        if (RPSTemp.getUsed(j) != rps->getUsed(j))
1077        {
1078          printf("Warning: Used by Current in RPS is different between intra and inter RPS specified in the config file.\n");
1079          rps->setUsed(j,RPSTemp.getUsed(j));
1080        }
1081      }
1082#endif
1083    }
1084#else
1085    rps->setInterRPSPrediction(ge.m_interRPSPrediction);
1086    if (ge.m_interRPSPrediction)
1087    {
1088      rps->setDeltaRIdxMinus1(0);
1089      rps->setDeltaRPS(ge.m_deltaRPS);
1090      rps->setNumRefIdc(ge.m_numRefIdc);
1091      for (Int j = 0; j < ge.m_numRefIdc; j++ )
1092      {
1093        rps->setRefIdc(j, ge.m_refIdc[j]);
1094      }
1095#if WRITE_BACK
1096      // the folowing code overwrite the deltaPOC and Used by current values read from the config file with the ones
1097      // computed from the RefIdc.  This is not necessary if both are identical. Currently there is no check to see if they are identical.
1098      numNeg = 0;
1099      numPos = 0;
1100      TComReferencePictureSet*     RPSRef = m_RPSList.getReferencePictureSet(i-1);
1101
1102      for (Int j = 0; j < ge.m_numRefIdc; j++ )
1103      {
1104        if (ge.m_refIdc[j])
1105        {
1106          Int deltaPOC = ge.m_deltaRPS + ((j < RPSRef->getNumberOfPictures())? RPSRef->getDeltaPOC(j) : 0);
1107          rps->setDeltaPOC((numNeg+numPos),deltaPOC);
1108          rps->setUsed((numNeg+numPos),ge.m_refIdc[j]==1?1:0);
1109          if (deltaPOC<0)
1110          {
1111            numNeg++;
1112          }
1113          else
1114          {
1115            numPos++;
1116          }
1117        }
1118      }
1119      rps->setNumberOfNegativePictures(numNeg);
1120      rps->setNumberOfPositivePictures(numPos);
1121      rps->sortDeltaPOC();
1122#endif
1123    }
1124#endif //INTER_RPS_AUTO
1125  }
1126  //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.
1127  //The position = GOPSize + extraRPSs which is (a priori) unused is reserved for this field in the RPS.
1128  if (isFieldCoding) 
1129  {
1130    rps = rpsList->getReferencePictureSet(getGOPSize()+m_extraRPSs);
1131    rps->setNumberOfPictures(1);
1132    rps->setNumberOfNegativePictures(1);
1133    rps->setNumberOfPositivePictures(0);
1134    rps->setNumberOfLongtermPictures(0);
1135    rps->setDeltaPOC(0,-1);
1136    rps->setPOC(0,0);
1137    rps->setUsed(0,true);
1138    rps->setInterRPSPrediction(false);
1139    rps->setDeltaRIdxMinus1(0);
1140    rps->setDeltaRPS(0);
1141    rps->setNumRefIdc(0);
1142}
1143}
1144
1145   // This is a function that
1146   // determines what Reference Picture Set to use
1147   // for a specific slice (with POC = POCCurr)
1148Void TEncTop::selectReferencePictureSet(TComSlice* slice, Int POCCurr, Int GOPid )
1149{
1150#if H_MV
1151  if( slice->getRapPicFlag() == true && getLayerId() > 0 && POCCurr == 0 )
1152  {
1153    TComReferencePictureSet* rps = slice->getLocalRPS();
1154    rps->setNumberOfNegativePictures(0);
1155    rps->setNumberOfPositivePictures(0);
1156    rps->setNumberOfLongtermPictures(0);
1157    rps->setNumberOfPictures(0);
1158    slice->setRPS(rps);
1159  }
1160  else
1161  {
1162#endif
1163  slice->setRPSidx(GOPid);
1164
1165  for(Int extraNum=m_iGOPSize; extraNum<m_extraRPSs+m_iGOPSize; extraNum++)
1166  {   
1167    if(m_uiIntraPeriod > 0 && getDecodingRefreshType() > 0)
1168    {
1169      Int POCIndex = POCCurr%m_uiIntraPeriod;
1170      if(POCIndex == 0)
1171      {
1172        POCIndex = m_uiIntraPeriod;
1173      }
1174      if(POCIndex == m_GOPList[extraNum].m_POC)
1175      {
1176        slice->setRPSidx(extraNum);
1177      }
1178    }
1179    else
1180    {
1181      if(POCCurr==m_GOPList[extraNum].m_POC)
1182      {
1183        slice->setRPSidx(extraNum);
1184      }
1185    }
1186  }
1187  if(POCCurr == 1 && slice->getPic()->isField())
1188  {
1189    slice->setRPSidx(m_iGOPSize+m_extraRPSs);
1190  }
1191
1192  slice->setRPS(getSPS()->getRPSList()->getReferencePictureSet(slice->getRPSidx()));
1193  slice->getRPS()->setNumberOfPictures(slice->getRPS()->getNumberOfNegativePictures()+slice->getRPS()->getNumberOfPositivePictures());
1194#if H_MV
1195  }
1196#endif
1197
1198}
1199
1200Int TEncTop::getReferencePictureSetIdxForSOP(TComSlice* slice, Int POCCurr, Int GOPid )
1201{
1202  int rpsIdx = GOPid;
1203
1204  for(Int extraNum=m_iGOPSize; extraNum<m_extraRPSs+m_iGOPSize; extraNum++)
1205  {   
1206    if(m_uiIntraPeriod > 0 && getDecodingRefreshType() > 0)
1207    {
1208      Int POCIndex = POCCurr%m_uiIntraPeriod;
1209      if(POCIndex == 0)
1210      {
1211        POCIndex = m_uiIntraPeriod;
1212      }
1213      if(POCIndex == m_GOPList[extraNum].m_POC)
1214      {
1215        rpsIdx = extraNum;
1216      }
1217    }
1218    else
1219    {
1220      if(POCCurr==m_GOPList[extraNum].m_POC)
1221      {
1222        rpsIdx = extraNum;
1223      }
1224    }
1225  }
1226
1227  return rpsIdx;
1228}
1229
1230Void  TEncTop::xInitPPSforTiles()
1231{
1232  m_cPPS.setUniformSpacingFlag( m_iUniformSpacingIdr );
1233  m_cPPS.setNumColumnsMinus1( m_iNumColumnsMinus1 );
1234  m_cPPS.setNumRowsMinus1( m_iNumRowsMinus1 );
1235  if( m_iUniformSpacingIdr == 0 )
1236  {
1237    m_cPPS.setColumnWidth( m_puiColumnWidth );
1238    m_cPPS.setRowHeight( m_puiRowHeight );
1239  }
1240  m_cPPS.setLoopFilterAcrossTilesEnabledFlag( m_loopFilterAcrossTilesEnabledFlag );
1241
1242  // # substreams is "per tile" when tiles are independent.
1243  if (m_iWaveFrontSynchro
1244    )
1245  {
1246    m_cPPS.setNumSubstreams(m_iWaveFrontSubstreams * (m_iNumColumnsMinus1+1));
1247  }
1248}
1249
1250Void  TEncCfg::xCheckGSParameters()
1251{
1252  Int   iWidthInCU = ( m_iSourceWidth%g_uiMaxCUWidth ) ? m_iSourceWidth/g_uiMaxCUWidth + 1 : m_iSourceWidth/g_uiMaxCUWidth;
1253  Int   iHeightInCU = ( m_iSourceHeight%g_uiMaxCUHeight ) ? m_iSourceHeight/g_uiMaxCUHeight + 1 : m_iSourceHeight/g_uiMaxCUHeight;
1254  UInt  uiCummulativeColumnWidth = 0;
1255  UInt  uiCummulativeRowHeight = 0;
1256
1257  //check the column relative parameters
1258  if( m_iNumColumnsMinus1 >= (1<<(LOG2_MAX_NUM_COLUMNS_MINUS1+1)) )
1259  {
1260    printf( "The number of columns is larger than the maximum allowed number of columns.\n" );
1261    exit( EXIT_FAILURE );
1262  }
1263
1264  if( m_iNumColumnsMinus1 >= iWidthInCU )
1265  {
1266    printf( "The current picture can not have so many columns.\n" );
1267    exit( EXIT_FAILURE );
1268  }
1269
1270  if( m_iNumColumnsMinus1 && m_iUniformSpacingIdr==0 )
1271  {
1272    for(Int i=0; i<m_iNumColumnsMinus1; i++)
1273    {
1274      uiCummulativeColumnWidth += m_puiColumnWidth[i];
1275    }
1276
1277    if( uiCummulativeColumnWidth >= iWidthInCU )
1278    {
1279      printf( "The width of the column is too large.\n" );
1280      exit( EXIT_FAILURE );
1281    }
1282  }
1283
1284  //check the row relative parameters
1285  if( m_iNumRowsMinus1 >= (1<<(LOG2_MAX_NUM_ROWS_MINUS1+1)) )
1286  {
1287    printf( "The number of rows is larger than the maximum allowed number of rows.\n" );
1288    exit( EXIT_FAILURE );
1289  }
1290
1291  if( m_iNumRowsMinus1 >= iHeightInCU )
1292  {
1293    printf( "The current picture can not have so many rows.\n" );
1294    exit( EXIT_FAILURE );
1295  }
1296
1297  if( m_iNumRowsMinus1 && m_iUniformSpacingIdr==0 )
1298  {
1299    for(Int i=0; i<m_iNumRowsMinus1; i++)
1300      uiCummulativeRowHeight += m_puiRowHeight[i];
1301
1302    if( uiCummulativeRowHeight >= iHeightInCU )
1303    {
1304      printf( "The height of the row is too large.\n" );
1305      exit( EXIT_FAILURE );
1306    }
1307  }
1308}
1309#if H_MV
1310Void TEncTop::printSummary( Int numAllPicCoded, Bool isField )
1311{
1312  assert ( !isField ); // Multiview and field coding need to be further unified
1313  assert (numAllPicCoded == m_cAnalyzeAll.getNumPic());
1314
1315  //--CFG_KDY
1316  m_cAnalyzeAll.setFrmRate( getFrameRate() );
1317  m_cAnalyzeI.setFrmRate( getFrameRate() );
1318  m_cAnalyzeP.setFrmRate( getFrameRate() );
1319  m_cAnalyzeB.setFrmRate( getFrameRate() );
1320
1321  //-- all
1322  printf( "\n\nSUMMARY ------------------------------------------- LayerId %2d\n", m_layerId );
1323
1324  m_cAnalyzeAll.printOut('a');
1325
1326  printf( "\n\nI Slices--------------------------------------------------------\n" );
1327  m_cAnalyzeI.printOut('i');
1328
1329  printf( "\n\nP Slices--------------------------------------------------------\n" );
1330  m_cAnalyzeP.printOut('p');
1331
1332  printf( "\n\nB Slices--------------------------------------------------------\n" );
1333  m_cAnalyzeB.printOut('b');
1334
1335#if _SUMMARY_OUT_
1336  m_cAnalyzeAll.printSummaryOut();
1337#endif
1338#if _SUMMARY_PIC_
1339  m_cAnalyzeI.printSummary('I');
1340  m_cAnalyzeP.printSummary('P');
1341  m_cAnalyzeB.printSummary('B');
1342#endif
1343}
1344
1345Int TEncTop::getFrameId(Int iGOPid) 
1346{
1347  if(m_iPOCLast == 0)
1348  {
1349    return(0 );
1350  }
1351  else
1352  {
1353    return m_iPOCLast -m_iNumPicRcvd+ getGOPEntry(iGOPid).m_POC ;
1354  }
1355}
1356
1357TComPic* TEncTop::getPic( Int poc )
1358{
1359  TComList<TComPic*>* listPic = getListPic();
1360  TComPic* pcPic = NULL;
1361  for(TComList<TComPic*>::iterator it=listPic->begin(); it!=listPic->end(); it++)
1362  {
1363    if( (*it)->getPOC() == poc )
1364    {
1365      pcPic = *it ;
1366      break ;
1367    }
1368  }
1369  return pcPic;
1370}
1371#endif
1372
1373#if H_3D_VSO
1374Void TEncTop::setupRenModel( Int iPoc, Int iEncViewIdx, Int iEncContent, Int iHorOffset )
1375{
1376  TRenModel* rendererModel = m_cRdCost.getRenModel(); 
1377  rendererModel->setupPart( iHorOffset, std::min( (Int) g_uiMaxCUHeight, (Int) ( m_iSourceHeight - iHorOffset ) )) ; 
1378 
1379  Int iEncViewSIdx = m_cameraParameters->getBaseId2SortedId()[ iEncViewIdx ];
1380
1381  // setup base views
1382  Int iNumOfBV = m_renderModelParameters->getNumOfBaseViewsForView( iEncViewSIdx, iEncContent );
1383
1384  for (Int iCurView = 0; iCurView < iNumOfBV; iCurView++ )
1385  {
1386    Int iBaseViewSIdx;
1387    Int iVideoDistMode;
1388    Int iDepthDistMode;
1389
1390    m_renderModelParameters->getBaseViewData( iEncViewSIdx, iEncContent, iCurView, iBaseViewSIdx, iVideoDistMode, iDepthDistMode );
1391
1392    AOT( iVideoDistMode < 0 || iVideoDistMode > 2 );
1393
1394    Int iBaseViewIdx = m_cameraParameters->getBaseSortedId2Id()[ iBaseViewSIdx ];
1395
1396    TComPicYuv* pcPicYuvVideoRec  = m_ivPicLists->getPicYuv( iBaseViewIdx, false, iPoc, true  );
1397    TComPicYuv* pcPicYuvDepthRec  = m_ivPicLists->getPicYuv( iBaseViewIdx, true , iPoc, true  );
1398    TComPicYuv* pcPicYuvVideoOrg  = m_ivPicLists->getPicYuv( iBaseViewIdx, false, iPoc, false );
1399    TComPicYuv* pcPicYuvDepthOrg  = m_ivPicLists->getPicYuv( iBaseViewIdx, true , iPoc, false );   
1400
1401    TComPicYuv* pcPicYuvVideoRef  = ( iVideoDistMode == 2 ) ? pcPicYuvVideoOrg  : NULL;
1402    TComPicYuv* pcPicYuvDepthRef  = ( iDepthDistMode == 2 ) ? pcPicYuvDepthOrg  : NULL;
1403
1404    TComPicYuv* pcPicYuvVideoTest = ( iVideoDistMode == 0 ) ? pcPicYuvVideoOrg  : pcPicYuvVideoRec;
1405    TComPicYuv* pcPicYuvDepthTest = ( iDepthDistMode == 0 ) ? pcPicYuvDepthOrg  : pcPicYuvDepthRec;
1406
1407    AOT( (iVideoDistMode == 2) != (pcPicYuvVideoRef != NULL) );
1408    AOT( (iDepthDistMode == 2) != (pcPicYuvDepthRef != NULL) );
1409    AOT( pcPicYuvDepthTest == NULL );
1410    AOT( pcPicYuvVideoTest == NULL );
1411
1412    rendererModel->setBaseView( iBaseViewSIdx, pcPicYuvVideoTest, pcPicYuvDepthTest, pcPicYuvVideoRef, pcPicYuvDepthRef );
1413  }
1414
1415  rendererModel->setErrorMode( iEncViewSIdx, iEncContent, 0 );
1416  // setup virtual views
1417  Int iNumOfSV  = m_renderModelParameters->getNumOfModelsForView( iEncViewSIdx, iEncContent );
1418  for (Int iCurView = 0; iCurView < iNumOfSV; iCurView++ )
1419  {
1420    Int iOrgRefBaseViewSIdx;
1421    Int iLeftBaseViewSIdx;
1422    Int iRightBaseViewSIdx;
1423    Int iSynthViewRelNum;
1424    Int iModelNum;
1425    Int iBlendMode;
1426    m_renderModelParameters->getSingleModelData(iEncViewSIdx, iEncContent, iCurView, iModelNum, iBlendMode,iLeftBaseViewSIdx, iRightBaseViewSIdx, iOrgRefBaseViewSIdx, iSynthViewRelNum );
1427
1428    Int iLeftBaseViewIdx    = -1;
1429    Int iRightBaseViewIdx   = -1;
1430
1431    TComPicYuv* pcPicYuvOrgRef  = NULL;
1432    Int**      ppiShiftLUTLeft  = NULL;
1433    Int**      ppiShiftLUTRight = NULL;
1434    Int**      ppiBaseShiftLUTLeft  = NULL;
1435    Int**      ppiBaseShiftLUTRight = NULL;
1436
1437
1438    Int        iDistToLeft      = -1;
1439
1440    Int iSynthViewIdx = m_cameraParameters->synthRelNum2Idx( iSynthViewRelNum );
1441
1442    if ( iLeftBaseViewSIdx != -1 )
1443    {
1444      iLeftBaseViewIdx   = m_cameraParameters->getBaseSortedId2Id()   [ iLeftBaseViewSIdx ];
1445      ppiShiftLUTLeft    = m_cameraParameters->getSynthViewShiftLUTI()[ iLeftBaseViewIdx  ][ iSynthViewIdx  ];
1446    }
1447
1448    if ( iRightBaseViewSIdx != -1 )
1449    {
1450      iRightBaseViewIdx  = m_cameraParameters->getBaseSortedId2Id()   [iRightBaseViewSIdx ];
1451      ppiShiftLUTRight   = m_cameraParameters->getSynthViewShiftLUTI()[ iRightBaseViewIdx ][ iSynthViewIdx ];
1452    }
1453
1454    if ( iRightBaseViewSIdx != -1 && iLeftBaseViewSIdx != -1 )
1455    {
1456      iDistToLeft          = m_cameraParameters->getRelDistLeft(  iSynthViewIdx , iLeftBaseViewIdx, iRightBaseViewIdx);
1457      ppiBaseShiftLUTLeft  = m_cameraParameters->getBaseViewShiftLUTI() [ iLeftBaseViewIdx  ][ iRightBaseViewIdx ];
1458      ppiBaseShiftLUTRight = m_cameraParameters->getBaseViewShiftLUTI() [ iRightBaseViewIdx ][ iLeftBaseViewIdx  ];
1459
1460    }
1461
1462    if ( iOrgRefBaseViewSIdx != -1 )
1463    {
1464      pcPicYuvOrgRef = m_ivPicLists->getPicYuv(  m_cameraParameters->getBaseSortedId2Id()[ iOrgRefBaseViewSIdx ] , false, iPoc, false );
1465      AOF ( pcPicYuvOrgRef );
1466    }
1467
1468    rendererModel->setSingleModel( iModelNum, ppiShiftLUTLeft, ppiBaseShiftLUTLeft, ppiShiftLUTRight, ppiBaseShiftLUTRight, iDistToLeft, pcPicYuvOrgRef );
1469  }
1470}
1471#endif
1472//! \}
Note: See TracBrowser for help on using the repository browser.