source: SHVCSoftware/trunk/source/Lib/TLibEncoder/TEncTop.cpp @ 698

Last change on this file since 698 was 644, checked in by seregin, 11 years ago

merge with SHM-5.1-dev branch

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