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

Last change on this file since 718 was 713, checked in by seregin, 11 years ago

merge with SHM-6-dev

  • Property svn:eol-style set to native
File size: 56.1 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
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;
85#if SVC_EXTENSION
86  memset(m_cIlpPic, 0, sizeof(m_cIlpPic));
87#if REF_IDX_MFM
88  m_bMFMEnabledFlag = false;
89#endif
90  m_numScaledRefLayerOffsets = 0;
91#if POC_RESET_FLAG
92  m_pocAdjustmentValue     = 0;
93#endif
94#if NO_CLRAS_OUTPUT_FLAG
95  m_noClrasOutputFlag          = false;
96  m_layerInitializedFlag       = false;
97  m_firstPicInLayerDecodedFlag = false;
98  m_noOutputOfPriorPicsFlags   = false;
99#endif
100#endif //SVC_EXTENSION
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
116
117  // create processing unit classes
118#if SVC_EXTENSION
119  m_cGOPEncoder.        create( m_layerId );
120#else
121  m_cGOPEncoder.        create();
122#endif
123#if AUXILIARY_PICTURES
124  m_cSliceEncoder.      create( getSourceWidth(), getSourceHeight(), m_chromaFormatIDC, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth );
125#else
126  m_cSliceEncoder.      create( getSourceWidth(), getSourceHeight(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth );
127#endif
128  m_cCuEncoder.         create( g_uiMaxCUDepth, g_uiMaxCUWidth, g_uiMaxCUHeight );
129  if (m_bUseSAO)
130  {
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
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  }
155
156  m_pppcRDSbacCoder = new TEncSbac** [g_uiMaxCUDepth+1];
157#if FAST_BIT_EST
158  m_pppcBinCoderCABAC = new TEncBinCABACCounter** [g_uiMaxCUDepth+1];
159#else
160  m_pppcBinCoderCABAC = new TEncBinCABAC** [g_uiMaxCUDepth+1];
161#endif
162
163  for ( Int iDepth = 0; iDepth < g_uiMaxCUDepth+1; iDepth++ )
164  {
165    m_pppcRDSbacCoder[iDepth] = new TEncSbac* [CI_NUM];
166#if FAST_BIT_EST
167    m_pppcBinCoderCABAC[iDepth] = new TEncBinCABACCounter* [CI_NUM];
168#else
169    m_pppcBinCoderCABAC[iDepth] = new TEncBinCABAC* [CI_NUM];
170#endif
171
172    for (Int iCIIdx = 0; iCIIdx < CI_NUM; iCIIdx ++ )
173    {
174      m_pppcRDSbacCoder[iDepth][iCIIdx] = new TEncSbac;
175#if FAST_BIT_EST
176      m_pppcBinCoderCABAC [iDepth][iCIIdx] = new TEncBinCABACCounter;
177#else
178      m_pppcBinCoderCABAC [iDepth][iCIIdx] = new TEncBinCABAC;
179#endif
180      m_pppcRDSbacCoder   [iDepth][iCIIdx]->init( m_pppcBinCoderCABAC [iDepth][iCIIdx] );
181    }
182  }
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
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  }
217
218  m_ppppcRDSbacCoders      = new TEncSbac***    [iNumSubstreams];
219  m_ppppcBinCodersCABAC    = new TEncBinCABAC***[iNumSubstreams];
220  for ( UInt ui = 0 ; ui < iNumSubstreams ; ui++ )
221  {
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++ )
226    {
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 ++ )
231      {
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] );
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  {
248    m_cEncSAO.destroyEncData();
249    m_cEncSAO.destroy();
250  }
251  m_cLoopFilter.        destroy();
252  m_cRateCtrl.          destroy();
253
254  Int iDepth;
255  for ( iDepth = 0; iDepth < g_uiMaxCUDepth+1; iDepth++ )
256  {
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  {
275    for ( iDepth = 0; iDepth < g_uiMaxCUDepth+1; iDepth++ )
276    {
277      for (Int iCIIdx = 0; iCIIdx < CI_NUM; iCIIdx ++ )
278      {
279        delete m_ppppcRDSbacCoders  [ui][iDepth][iCIIdx];
280        delete m_ppppcBinCodersCABAC[ui][iDepth][iCIIdx];
281      }
282    }
283
284    for ( iDepth = 0; iDepth < g_uiMaxCUDepth+1; iDepth++ )
285    {
286      delete [] m_ppppcRDSbacCoders  [ui][iDepth];
287      delete [] m_ppppcBinCodersCABAC[ui][iDepth];
288    }
289    delete[] m_ppppcRDSbacCoders  [ui];
290    delete[] m_ppppcBinCodersCABAC[ui];
291  }
292  delete[] m_ppppcRDSbacCoders;
293  delete[] m_ppppcBinCodersCABAC;
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 
301#if SVC_EXTENSION
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    }
310  }
311#else
312  // destroy ROM
313  destroyROM();
314#endif
315  return;
316}
317
318Void TEncTop::init(Bool isFieldCoding)
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();
329  xInitRPS(isFieldCoding);
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
404  m_cGOPEncoder.compressGOP(iPicIdInGOP, m_iPOCLast, m_iNumPicRcvd, m_cListPic, rcListPicYuvRecOut, accessUnitsOut, false, false);
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
461  m_cGOPEncoder.compressGOP(m_iPOCLast, m_iNumPicRcvd, m_cListPic, rcListPicYuvRecOut, accessUnitsOut, false, false);
462
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
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();
526
527    // compute image characteristics
528    if ( getUseAdaptiveQP() )
529    {
530      m_cPreanalyzer.xPreanalyze( dynamic_cast<TEncPic*>( pcTopField ) );
531    }   
532
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();
566
567    // compute image characteristics
568    if ( getUseAdaptiveQP() )
569    {
570      m_cPreanalyzer.xPreanalyze( dynamic_cast<TEncPic*>( pcBottomField ) );
571    }       
572
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    {
601#if AUXILIARY_PICTURES
602      rpcPicYuvRec->create( m_iSourceWidth, m_iSourceHeight, m_chromaFormatIDC, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth );
603#else
604      rpcPicYuvRec->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth );
605#endif
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   
680    TComPicYuv* rpcPicYuvRec;
681    if ( rcListPicYuvRecOut.size() == (UInt)m_iGOPSize )
682    {
683      rpcPicYuvRec = rcListPicYuvRecOut.popFront();
684    }
685    else
686    {
687      rpcPicYuvRec = new TComPicYuv;
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
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        {
781#if O0098_SCALED_REF_LAYER_ID
782          const Window scalEL = getSPS()->getScaledRefLayerWindowForLayer(m_cVPS.getRefLayerId(m_layerId, i));
783#else
784          const Window scalEL = getSPS()->getScaledRefLayerWindow(i);
785#endif
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
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#if Q0048_CGS_3D_ASYMLUT
799            || m_cPPS.getCGSFlag() > 0
800#endif
801#if LAYER_CTB
802            || pcEncTopBase->getSPS()->getMaxCUWidth() != m_cSPS.getMaxCUWidth() || pcEncTopBase->getSPS()->getMaxCUHeight() != m_cSPS.getMaxCUHeight() || pcEncTopBase->getSPS()->getMaxCUDepth() != m_cSPS.getMaxCUDepth()
803#endif
804            )
805#else
806          if(m_iSourceWidth != pcEncTopBase->getSourceWidth() || m_iSourceHeight != pcEncTopBase->getSourceHeight() || !zeroOffsets )
807#endif
808          {
809            pcEPic->setSpatialEnhLayerFlag( i, true );
810
811            //only for scalable extension
812#if SCALABILITY_MASK_E0104
813            assert( m_cVPS.getScalabilityMask(2) == true );
814#else
815            assert( m_cVPS.getScalabilityMask(1) == true );
816#endif
817          }
818        }
819      }
820#endif
821
822#if AUXILIARY_PICTURES
823#if SVC_UPSAMPLING
824      pcEPic->create( m_iSourceWidth, m_iSourceHeight, m_chromaFormatIDC, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, m_cPPS.getMaxCuDQPDepth()+1 ,
825                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics, &m_cSPS);
826#else
827      pcEPic->create( m_iSourceWidth, m_iSourceHeight, m_chromaFormatIDC, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, m_cPPS.getMaxCuDQPDepth()+1 ,
828                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics);
829#endif
830#else
831#if SVC_UPSAMPLING
832      pcEPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, m_cPPS.getMaxCuDQPDepth()+1 ,
833                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics, &m_cSPS);
834#else
835      pcEPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, m_cPPS.getMaxCuDQPDepth()+1 ,
836                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics);
837#endif
838#endif
839      rpcPic = pcEPic;
840    }
841    else
842    {
843      rpcPic = new TComPic;
844
845#if SVC_EXTENSION //Temporal solution, should be modified
846      if(m_layerId > 0)
847      {
848        for(UInt i = 0; i < m_cVPS.getNumDirectRefLayers( m_layerId ); i++ )
849        {
850#if O0098_SCALED_REF_LAYER_ID
851          const Window scalEL = getSPS()->getScaledRefLayerWindowForLayer(m_cVPS.getRefLayerId(m_layerId, i));
852#else
853          const Window scalEL = getSPS()->getScaledRefLayerWindow(i);
854#endif
855          Bool zeroOffsets = ( scalEL.getWindowLeftOffset() == 0 && scalEL.getWindowRightOffset() == 0 && scalEL.getWindowTopOffset() == 0 && scalEL.getWindowBottomOffset() == 0 );
856
857#if VPS_EXTN_DIRECT_REF_LAYERS
858          TEncTop *pcEncTopBase = (TEncTop *)getRefLayerEnc( i );
859#else
860          TEncTop *pcEncTopBase = (TEncTop *)getLayerEnc( m_layerId-1 );
861#endif
862#if O0194_DIFFERENT_BITDEPTH_EL_BL
863          UInt refLayerId = m_cVPS.getRefLayerId(m_layerId, i);
864          Bool sameBitDepths = ( g_bitDepthYLayer[m_layerId] == g_bitDepthYLayer[refLayerId] ) && ( g_bitDepthCLayer[m_layerId] == g_bitDepthCLayer[refLayerId] );
865
866          if( m_iSourceWidth != pcEncTopBase->getSourceWidth() || m_iSourceHeight != pcEncTopBase->getSourceHeight() || !zeroOffsets || !sameBitDepths
867#if Q0048_CGS_3D_ASYMLUT
868            || m_cPPS.getCGSFlag() > 0
869#endif
870#if LAYER_CTB
871            || pcEncTopBase->getSPS()->getMaxCUWidth() != m_cSPS.getMaxCUWidth() || pcEncTopBase->getSPS()->getMaxCUHeight() != m_cSPS.getMaxCUHeight() || pcEncTopBase->getSPS()->getMaxCUDepth() != m_cSPS.getMaxCUDepth()
872#endif
873)
874#else
875          if(m_iSourceWidth != pcEncTopBase->getSourceWidth() || m_iSourceHeight != pcEncTopBase->getSourceHeight() || !zeroOffsets )
876#endif
877          {
878            rpcPic->setSpatialEnhLayerFlag( i, true );
879
880            //only for scalable extension
881#if SCALABILITY_MASK_E0104
882            assert( m_cVPS.getScalabilityMask(2) == true );
883#else
884            assert( m_cVPS.getScalabilityMask(1) == true );
885#endif
886          }
887        }
888      }
889#endif
890
891#if AUXILIARY_PICTURES
892#if SVC_UPSAMPLING
893      rpcPic->create( m_iSourceWidth, m_iSourceHeight, m_chromaFormatIDC, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, 
894                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics, &m_cSPS);
895#else
896      rpcPic->create( m_iSourceWidth, m_iSourceHeight, m_chromaFormatIDC, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, 
897                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics);
898#endif
899#else
900#if SVC_UPSAMPLING
901      rpcPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, 
902                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics, &m_cSPS);
903#else
904      rpcPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, 
905                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics);
906#endif
907#endif
908    }
909    m_cListPic.pushBack( rpcPic );
910  }
911  rpcPic->setReconMark (false);
912 
913  m_iPOCLast++;
914  m_iNumPicRcvd++;
915 
916  rpcPic->getSlice(0)->setPOC( m_iPOCLast );
917  // mark it should be extended
918  rpcPic->getPicYuvRec()->setBorderExtension(false);
919}
920
921Void TEncTop::xInitSPS()
922{
923#if SVC_EXTENSION
924  m_cSPS.setLayerId(m_layerId);
925  m_cSPS.setNumScaledRefLayerOffsets(m_numScaledRefLayerOffsets);
926  for(Int i = 0; i < m_cSPS.getNumScaledRefLayerOffsets(); i++)
927  {
928#if O0098_SCALED_REF_LAYER_ID
929    m_cSPS.setScaledRefLayerId(i, m_scaledRefLayerId[i]);
930#endif
931    m_cSPS.getScaledRefLayerWindow(i) = m_scaledRefLayerWindow[i];
932#if P0312_VERT_PHASE_ADJ
933    m_cSPS.setVertPhasePositionEnableFlag( m_scaledRefLayerId[i], m_scaledRefLayerWindow[i].getVertPhasePositionEnableFlag() );
934#endif
935  }
936#endif //SVC_EXTENSION
937  ProfileTierLevel& profileTierLevel = *m_cSPS.getPTL()->getGeneralPTL();
938  profileTierLevel.setLevelIdc(m_level);
939  profileTierLevel.setTierFlag(m_levelTier);
940  profileTierLevel.setProfileIdc(m_profile);
941  profileTierLevel.setProfileCompatibilityFlag(m_profile, 1);
942  profileTierLevel.setProgressiveSourceFlag(m_progressiveSourceFlag);
943  profileTierLevel.setInterlacedSourceFlag(m_interlacedSourceFlag);
944  profileTierLevel.setNonPackedConstraintFlag(m_nonPackedConstraintFlag);
945  profileTierLevel.setFrameOnlyConstraintFlag(m_frameOnlyConstraintFlag);
946 
947  if (m_profile == Profile::MAIN10 && g_bitDepthY == 8 && g_bitDepthC == 8)
948  {
949    /* The above constraint is equal to Profile::MAIN */
950    profileTierLevel.setProfileCompatibilityFlag(Profile::MAIN, 1);
951  }
952  if (m_profile == Profile::MAIN)
953  {
954    /* A Profile::MAIN10 decoder can always decode Profile::MAIN */
955    profileTierLevel.setProfileCompatibilityFlag(Profile::MAIN10, 1);
956  }
957  /* XXX: should Main be marked as compatible with still picture? */
958  /* XXX: may be a good idea to refactor the above into a function
959   * that chooses the actual compatibility based upon options */
960
961  m_cSPS.setPicWidthInLumaSamples         ( m_iSourceWidth      );
962  m_cSPS.setPicHeightInLumaSamples        ( m_iSourceHeight     );
963  m_cSPS.setConformanceWindow             ( m_conformanceWindow );
964  m_cSPS.setMaxCUWidth    ( g_uiMaxCUWidth      );
965  m_cSPS.setMaxCUHeight   ( g_uiMaxCUHeight     );
966  m_cSPS.setMaxCUDepth    ( g_uiMaxCUDepth      );
967#if AUXILIARY_PICTURES
968  m_cSPS.setChromaFormatIdc( m_chromaFormatIDC);
969#endif
970
971  Int minCUSize = m_cSPS.getMaxCUWidth() >> ( m_cSPS.getMaxCUDepth()-g_uiAddCUDepth );
972  Int log2MinCUSize = 0;
973  while(minCUSize > 1)
974  {
975    minCUSize >>= 1;
976    log2MinCUSize++;
977  }
978
979  m_cSPS.setLog2MinCodingBlockSize(log2MinCUSize);
980  m_cSPS.setLog2DiffMaxMinCodingBlockSize(m_cSPS.getMaxCUDepth()-g_uiAddCUDepth);
981#if SVC_EXTENSION
982  m_cSPS.setSPSId         ( m_iSPSIdCnt       );
983#endif
984 
985  m_cSPS.setPCMLog2MinSize (m_uiPCMLog2MinSize);
986  m_cSPS.setUsePCM        ( m_usePCM           );
987  m_cSPS.setPCMLog2MaxSize( m_pcmLog2MaxSize  );
988
989  m_cSPS.setQuadtreeTULog2MaxSize( m_uiQuadtreeTULog2MaxSize );
990  m_cSPS.setQuadtreeTULog2MinSize( m_uiQuadtreeTULog2MinSize );
991  m_cSPS.setQuadtreeTUMaxDepthInter( m_uiQuadtreeTUMaxDepthInter    );
992  m_cSPS.setQuadtreeTUMaxDepthIntra( m_uiQuadtreeTUMaxDepthIntra    );
993 
994  m_cSPS.setTMVPFlagsPresent(false);
995
996  m_cSPS.setMaxTrSize   ( 1 << m_uiQuadtreeTULog2MaxSize );
997 
998  Int i;
999 
1000  for (i = 0; i < g_uiMaxCUDepth-g_uiAddCUDepth; i++ )
1001  {
1002    m_cSPS.setAMPAcc( i, m_useAMP );
1003    //m_cSPS.setAMPAcc( i, 1 );
1004  }
1005
1006  m_cSPS.setUseAMP ( m_useAMP );
1007
1008  for (i = g_uiMaxCUDepth-g_uiAddCUDepth; i < g_uiMaxCUDepth; i++ )
1009  {
1010    m_cSPS.setAMPAcc(i, 0);
1011  }
1012
1013#if REPN_FORMAT_IN_VPS
1014  m_cSPS.setBitDepthY( m_cVPS.getVpsRepFormat( m_cVPS.getVpsRepFormatIdx( m_layerId ) )->getBitDepthVpsLuma() );
1015  m_cSPS.setBitDepthC( m_cVPS.getVpsRepFormat( m_cVPS.getVpsRepFormatIdx( m_layerId ) )->getBitDepthVpsChroma()  );
1016
1017  m_cSPS.setQpBDOffsetY ( 6*(m_cVPS.getVpsRepFormat( m_cVPS.getVpsRepFormatIdx( m_layerId ) )->getBitDepthVpsLuma()  - 8) );
1018  m_cSPS.setQpBDOffsetC ( 6*(m_cVPS.getVpsRepFormat( m_cVPS.getVpsRepFormatIdx( m_layerId ) )->getBitDepthVpsChroma()  - 8) );
1019#else
1020  m_cSPS.setBitDepthY( g_bitDepthY );
1021  m_cSPS.setBitDepthC( g_bitDepthC );
1022
1023  m_cSPS.setQpBDOffsetY ( 6*(g_bitDepthY - 8) );
1024  m_cSPS.setQpBDOffsetC ( 6*(g_bitDepthC - 8) );
1025#endif
1026
1027  m_cSPS.setUseSAO( m_bUseSAO );
1028
1029  m_cSPS.setMaxTLayers( m_maxTempLayer );
1030  m_cSPS.setTemporalIdNestingFlag( ( m_maxTempLayer == 1 ) ? true : false );
1031  for ( i = 0; i < min(m_cSPS.getMaxTLayers(),(UInt) MAX_TLAYER); i++ )
1032  {
1033    m_cSPS.setMaxDecPicBuffering(m_maxDecPicBuffering[i], i);
1034    m_cSPS.setNumReorderPics(m_numReorderPics[i], i);
1035  }
1036  m_cSPS.setPCMBitDepthLuma (g_uiPCMBitDepthLuma);
1037  m_cSPS.setPCMBitDepthChroma (g_uiPCMBitDepthChroma);
1038  m_cSPS.setPCMFilterDisableFlag  ( m_bPCMFilterDisableFlag );
1039
1040  m_cSPS.setScalingListFlag ( (m_useScalingListId == 0) ? 0 : 1 );
1041
1042  m_cSPS.setUseStrongIntraSmoothing( m_useStrongIntraSmoothing );
1043
1044  m_cSPS.setVuiParametersPresentFlag(getVuiParametersPresentFlag());
1045  if (m_cSPS.getVuiParametersPresentFlag())
1046  {
1047    TComVUI* pcVUI = m_cSPS.getVuiParameters();
1048    pcVUI->setAspectRatioInfoPresentFlag(getAspectRatioIdc() != -1);
1049    pcVUI->setAspectRatioIdc(getAspectRatioIdc());
1050    pcVUI->setSarWidth(getSarWidth());
1051    pcVUI->setSarHeight(getSarHeight());
1052    pcVUI->setOverscanInfoPresentFlag(getOverscanInfoPresentFlag());
1053    pcVUI->setOverscanAppropriateFlag(getOverscanAppropriateFlag());
1054    pcVUI->setVideoSignalTypePresentFlag(getVideoSignalTypePresentFlag());
1055    pcVUI->setVideoFormat(getVideoFormat());
1056    pcVUI->setVideoFullRangeFlag(getVideoFullRangeFlag());
1057    pcVUI->setColourDescriptionPresentFlag(getColourDescriptionPresentFlag());
1058    pcVUI->setColourPrimaries(getColourPrimaries());
1059    pcVUI->setTransferCharacteristics(getTransferCharacteristics());
1060    pcVUI->setMatrixCoefficients(getMatrixCoefficients());
1061    pcVUI->setChromaLocInfoPresentFlag(getChromaLocInfoPresentFlag());
1062    pcVUI->setChromaSampleLocTypeTopField(getChromaSampleLocTypeTopField());
1063    pcVUI->setChromaSampleLocTypeBottomField(getChromaSampleLocTypeBottomField());
1064    pcVUI->setNeutralChromaIndicationFlag(getNeutralChromaIndicationFlag());
1065    pcVUI->setDefaultDisplayWindow(getDefaultDisplayWindow());
1066    pcVUI->setFrameFieldInfoPresentFlag(getFrameFieldInfoPresentFlag());
1067    pcVUI->setFieldSeqFlag(false);
1068    pcVUI->setHrdParametersPresentFlag(false);
1069    pcVUI->getTimingInfo()->setPocProportionalToTimingFlag(getPocProportionalToTimingFlag());
1070    pcVUI->getTimingInfo()->setNumTicksPocDiffOneMinus1   (getNumTicksPocDiffOneMinus1()   );
1071    pcVUI->setBitstreamRestrictionFlag(getBitstreamRestrictionFlag());
1072    pcVUI->setTilesFixedStructureFlag(getTilesFixedStructureFlag());
1073    pcVUI->setMotionVectorsOverPicBoundariesFlag(getMotionVectorsOverPicBoundariesFlag());
1074    pcVUI->setMinSpatialSegmentationIdc(getMinSpatialSegmentationIdc());
1075    pcVUI->setMaxBytesPerPicDenom(getMaxBytesPerPicDenom());
1076    pcVUI->setMaxBitsPerMinCuDenom(getMaxBitsPerMinCuDenom());
1077    pcVUI->setLog2MaxMvLengthHorizontal(getLog2MaxMvLengthHorizontal());
1078    pcVUI->setLog2MaxMvLengthVertical(getLog2MaxMvLengthVertical());
1079  }
1080}
1081
1082Void TEncTop::xInitPPS()
1083{
1084#if SCALINGLIST_INFERRING
1085  m_cPPS.setLayerId( m_layerId );
1086#endif
1087
1088  m_cPPS.setConstrainedIntraPred( m_bUseConstrainedIntraPred );
1089  Bool bUseDQP = (getMaxCuDQPDepth() > 0)? true : false;
1090
1091  if((getMaxDeltaQP() != 0 )|| getUseAdaptiveQP())
1092  {
1093    bUseDQP = true;
1094  }
1095
1096  if(bUseDQP)
1097  {
1098    m_cPPS.setUseDQP(true);
1099    m_cPPS.setMaxCuDQPDepth( m_iMaxCuDQPDepth );
1100    m_cPPS.setMinCuDQPSize( m_cPPS.getSPS()->getMaxCUWidth() >> ( m_cPPS.getMaxCuDQPDepth()) );
1101  }
1102  else
1103  {
1104    m_cPPS.setUseDQP(false);
1105    m_cPPS.setMaxCuDQPDepth( 0 );
1106    m_cPPS.setMinCuDQPSize( m_cPPS.getSPS()->getMaxCUWidth() >> ( m_cPPS.getMaxCuDQPDepth()) );
1107  }
1108
1109  if ( m_RCEnableRateControl )
1110  {
1111    m_cPPS.setUseDQP(true);
1112    m_cPPS.setMaxCuDQPDepth( 0 );
1113    m_cPPS.setMinCuDQPSize( m_cPPS.getSPS()->getMaxCUWidth() >> ( m_cPPS.getMaxCuDQPDepth()) );
1114  } 
1115
1116  m_cPPS.setChromaCbQpOffset( m_chromaCbQpOffset );
1117  m_cPPS.setChromaCrQpOffset( m_chromaCrQpOffset );
1118
1119  m_cPPS.setNumSubstreams(m_iWaveFrontSubstreams);
1120  m_cPPS.setEntropyCodingSyncEnabledFlag( m_iWaveFrontSynchro > 0 );
1121  m_cPPS.setTilesEnabledFlag( (m_iNumColumnsMinus1 > 0 || m_iNumRowsMinus1 > 0) );
1122  m_cPPS.setUseWP( m_useWeightedPred );
1123  m_cPPS.setWPBiPred( m_useWeightedBiPred );
1124  m_cPPS.setOutputFlagPresentFlag( false );
1125  m_cPPS.setSignHideFlag(getSignHideFlag());
1126  if ( getDeblockingFilterMetric() )
1127  {
1128    m_cPPS.setDeblockingFilterControlPresentFlag (true);
1129    m_cPPS.setDeblockingFilterOverrideEnabledFlag(true);
1130    m_cPPS.setPicDisableDeblockingFilterFlag(false);
1131    m_cPPS.setDeblockingFilterBetaOffsetDiv2(0);
1132    m_cPPS.setDeblockingFilterTcOffsetDiv2(0);
1133  } 
1134  else
1135  {
1136  m_cPPS.setDeblockingFilterControlPresentFlag (m_DeblockingFilterControlPresent );
1137  }
1138  m_cPPS.setLog2ParallelMergeLevelMinus2   (m_log2ParallelMergeLevelMinus2 );
1139  m_cPPS.setCabacInitPresentFlag(CABAC_INIT_PRESENT_FLAG);
1140  m_cPPS.setLoopFilterAcrossSlicesEnabledFlag( m_bLFCrossSliceBoundaryFlag );
1141  Int histogram[MAX_NUM_REF + 1];
1142  for( Int i = 0; i <= MAX_NUM_REF; i++ )
1143  {
1144    histogram[i]=0;
1145  }
1146  for( Int i = 0; i < getGOPSize(); i++ )
1147  {
1148    assert(getGOPEntry(i).m_numRefPicsActive >= 0 && getGOPEntry(i).m_numRefPicsActive <= MAX_NUM_REF);
1149    histogram[getGOPEntry(i).m_numRefPicsActive]++;
1150  }
1151  Int maxHist=-1;
1152  Int bestPos=0;
1153  for( Int i = 0; i <= MAX_NUM_REF; i++ )
1154  {
1155    if(histogram[i]>maxHist)
1156    {
1157      maxHist=histogram[i];
1158      bestPos=i;
1159    }
1160  }
1161  assert(bestPos <= 15);
1162  m_cPPS.setNumRefIdxL0DefaultActive(bestPos);
1163  m_cPPS.setNumRefIdxL1DefaultActive(bestPos);
1164  m_cPPS.setTransquantBypassEnableFlag(getTransquantBypassEnableFlag());
1165  m_cPPS.setUseTransformSkip( m_useTransformSkip );
1166  if (m_sliceSegmentMode)
1167  {
1168    m_cPPS.setDependentSliceSegmentsEnabledFlag( true );
1169  }
1170  if( m_cPPS.getDependentSliceSegmentsEnabledFlag() )
1171  {
1172    Int NumCtx = m_cPPS.getEntropyCodingSyncEnabledFlag()?2:1;
1173    m_cSliceEncoder.initCtxMem( NumCtx );
1174    for ( UInt st = 0; st < NumCtx; st++ )
1175    {
1176      TEncSbac* ctx = NULL;
1177      ctx = new TEncSbac;
1178      ctx->init( &m_cBinCoderCABAC );
1179      m_cSliceEncoder.setCtxMem( ctx, st );
1180    }
1181  }
1182#if SVC_EXTENSION
1183  if (!m_layerId)
1184  {
1185    m_cPPS.setListsModificationPresentFlag(false);
1186  }
1187  else
1188  {
1189    m_cPPS.setListsModificationPresentFlag(true);
1190  }
1191
1192  m_cPPS.setPPSId         ( m_iPPSIdCnt         );
1193  m_cPPS.setSPSId         ( m_iSPSIdCnt         );
1194#endif
1195#if POC_RESET_FLAG
1196  m_cPPS.setNumExtraSliceHeaderBits( 2 );
1197#endif
1198#if O0149_CROSS_LAYER_BLA_FLAG
1199  if (m_crossLayerBLAFlag)
1200  {
1201    m_cPPS.setNumExtraSliceHeaderBits( 3 );
1202  }
1203#endif
1204#if Q0048_CGS_3D_ASYMLUT
1205  m_cPPS.setCGSFlag( m_nCGSFlag );
1206#endif
1207}
1208
1209//Function for initializing m_RPSList, a list of TComReferencePictureSet, based on the GOPEntry objects read from the config file.
1210Void TEncTop::xInitRPS(Bool isFieldCoding)
1211{
1212  TComReferencePictureSet*      rps;
1213 
1214  m_cSPS.createRPSList(getGOPSize()+m_extraRPSs+1);
1215  TComRPSList* rpsList = m_cSPS.getRPSList();
1216
1217  for( Int i = 0; i < getGOPSize()+m_extraRPSs; i++) 
1218  {
1219    GOPEntry ge = getGOPEntry(i);
1220    rps = rpsList->getReferencePictureSet(i);
1221    rps->setNumberOfPictures(ge.m_numRefPics);
1222    rps->setNumRefIdc(ge.m_numRefIdc);
1223    Int numNeg = 0;
1224    Int numPos = 0;
1225    for( Int j = 0; j < ge.m_numRefPics; j++)
1226    {
1227      rps->setDeltaPOC(j,ge.m_referencePics[j]);
1228      rps->setUsed(j,ge.m_usedByCurrPic[j]);
1229      if(ge.m_referencePics[j]>0)
1230      {
1231        numPos++;
1232      }
1233      else
1234      {
1235        numNeg++;
1236      }
1237    }
1238    rps->setNumberOfNegativePictures(numNeg);
1239    rps->setNumberOfPositivePictures(numPos);
1240
1241    // handle inter RPS intialization from the config file.
1242#if AUTO_INTER_RPS
1243    rps->setInterRPSPrediction(ge.m_interRPSPrediction > 0);  // not very clean, converting anything > 0 to true.
1244    rps->setDeltaRIdxMinus1(0);                               // index to the Reference RPS is always the previous one.
1245    TComReferencePictureSet*     RPSRef = rpsList->getReferencePictureSet(i-1);  // get the reference RPS
1246
1247    if (ge.m_interRPSPrediction == 2)  // Automatic generation of the inter RPS idc based on the RIdx provided.
1248    {
1249      Int deltaRPS = getGOPEntry(i-1).m_POC - ge.m_POC;  // the ref POC - current POC
1250      Int numRefDeltaPOC = RPSRef->getNumberOfPictures();
1251
1252      rps->setDeltaRPS(deltaRPS);           // set delta RPS
1253      rps->setNumRefIdc(numRefDeltaPOC+1);  // set the numRefIdc to the number of pictures in the reference RPS + 1.
1254      Int count=0;
1255      for (Int j = 0; j <= numRefDeltaPOC; j++ ) // cycle through pics in reference RPS.
1256      {
1257        Int RefDeltaPOC = (j<numRefDeltaPOC)? RPSRef->getDeltaPOC(j): 0;  // if it is the last decoded picture, set RefDeltaPOC = 0
1258        rps->setRefIdc(j, 0);
1259        for (Int k = 0; k < rps->getNumberOfPictures(); k++ )  // cycle through pics in current RPS.
1260        {
1261          if (rps->getDeltaPOC(k) == ( RefDeltaPOC + deltaRPS))  // if the current RPS has a same picture as the reference RPS.
1262          {
1263              rps->setRefIdc(j, (rps->getUsed(k)?1:2));
1264              count++;
1265              break;
1266          }
1267        }
1268      }
1269      if (count != rps->getNumberOfPictures())
1270      {
1271        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");
1272        rps->setInterRPSPrediction(0);
1273      }
1274    }
1275    else if (ge.m_interRPSPrediction == 1)  // inter RPS idc based on the RefIdc values provided in config file.
1276    {
1277      rps->setDeltaRPS(ge.m_deltaRPS);
1278      rps->setNumRefIdc(ge.m_numRefIdc);
1279      for (Int j = 0; j < ge.m_numRefIdc; j++ )
1280      {
1281        rps->setRefIdc(j, ge.m_refIdc[j]);
1282      }
1283#if WRITE_BACK
1284      // the folowing code overwrite the deltaPOC and Used by current values read from the config file with the ones
1285      // computed from the RefIdc.  A warning is printed if they are not identical.
1286      numNeg = 0;
1287      numPos = 0;
1288      TComReferencePictureSet      RPSTemp;  // temporary variable
1289
1290      for (Int j = 0; j < ge.m_numRefIdc; j++ )
1291      {
1292        if (ge.m_refIdc[j])
1293        {
1294          Int deltaPOC = ge.m_deltaRPS + ((j < RPSRef->getNumberOfPictures())? RPSRef->getDeltaPOC(j) : 0);
1295          RPSTemp.setDeltaPOC((numNeg+numPos),deltaPOC);
1296          RPSTemp.setUsed((numNeg+numPos),ge.m_refIdc[j]==1?1:0);
1297          if (deltaPOC<0)
1298          {
1299            numNeg++;
1300          }
1301          else
1302          {
1303            numPos++;
1304          }
1305        }
1306      }
1307      if (numNeg != rps->getNumberOfNegativePictures())
1308      {
1309        printf("Warning: number of negative pictures in RPS is different between intra and inter RPS specified in the config file.\n");
1310        rps->setNumberOfNegativePictures(numNeg);
1311        rps->setNumberOfPictures(numNeg+numPos);
1312      }
1313      if (numPos != rps->getNumberOfPositivePictures())
1314      {
1315        printf("Warning: number of positive pictures in RPS is different between intra and inter RPS specified in the config file.\n");
1316        rps->setNumberOfPositivePictures(numPos);
1317        rps->setNumberOfPictures(numNeg+numPos);
1318      }
1319      RPSTemp.setNumberOfPictures(numNeg+numPos);
1320      RPSTemp.setNumberOfNegativePictures(numNeg);
1321      RPSTemp.sortDeltaPOC();     // sort the created delta POC before comparing
1322      // check if Delta POC and Used are the same
1323      // print warning if they are not.
1324      for (Int j = 0; j < ge.m_numRefIdc; j++ )
1325      {
1326        if (RPSTemp.getDeltaPOC(j) != rps->getDeltaPOC(j))
1327        {
1328          printf("Warning: delta POC is different between intra RPS and inter RPS specified in the config file.\n");
1329          rps->setDeltaPOC(j,RPSTemp.getDeltaPOC(j));
1330        }
1331        if (RPSTemp.getUsed(j) != rps->getUsed(j))
1332        {
1333          printf("Warning: Used by Current in RPS is different between intra and inter RPS specified in the config file.\n");
1334          rps->setUsed(j,RPSTemp.getUsed(j));
1335        }
1336      }
1337#endif
1338    }
1339#else
1340    rps->setInterRPSPrediction(ge.m_interRPSPrediction);
1341    if (ge.m_interRPSPrediction)
1342    {
1343      rps->setDeltaRIdxMinus1(0);
1344      rps->setDeltaRPS(ge.m_deltaRPS);
1345      rps->setNumRefIdc(ge.m_numRefIdc);
1346      for (Int j = 0; j < ge.m_numRefIdc; j++ )
1347      {
1348        rps->setRefIdc(j, ge.m_refIdc[j]);
1349      }
1350#if WRITE_BACK
1351      // the folowing code overwrite the deltaPOC and Used by current values read from the config file with the ones
1352      // computed from the RefIdc.  This is not necessary if both are identical. Currently there is no check to see if they are identical.
1353      numNeg = 0;
1354      numPos = 0;
1355      TComReferencePictureSet*     RPSRef = m_RPSList.getReferencePictureSet(i-1);
1356
1357      for (Int j = 0; j < ge.m_numRefIdc; j++ )
1358      {
1359        if (ge.m_refIdc[j])
1360        {
1361          Int deltaPOC = ge.m_deltaRPS + ((j < RPSRef->getNumberOfPictures())? RPSRef->getDeltaPOC(j) : 0);
1362          rps->setDeltaPOC((numNeg+numPos),deltaPOC);
1363          rps->setUsed((numNeg+numPos),ge.m_refIdc[j]==1?1:0);
1364          if (deltaPOC<0)
1365          {
1366            numNeg++;
1367          }
1368          else
1369          {
1370            numPos++;
1371          }
1372        }
1373      }
1374      rps->setNumberOfNegativePictures(numNeg);
1375      rps->setNumberOfPositivePictures(numPos);
1376      rps->sortDeltaPOC();
1377#endif
1378    }
1379#endif //INTER_RPS_AUTO
1380  }
1381  //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.
1382  //The position = GOPSize + extraRPSs which is (a priori) unused is reserved for this field in the RPS.
1383  if (isFieldCoding) 
1384  {
1385    rps = rpsList->getReferencePictureSet(getGOPSize()+m_extraRPSs);
1386    rps->setNumberOfPictures(1);
1387    rps->setNumberOfNegativePictures(1);
1388    rps->setNumberOfPositivePictures(0);
1389    rps->setNumberOfLongtermPictures(0);
1390    rps->setDeltaPOC(0,-1);
1391    rps->setPOC(0,0);
1392    rps->setUsed(0,true);
1393    rps->setInterRPSPrediction(false);
1394    rps->setDeltaRIdxMinus1(0);
1395    rps->setDeltaRPS(0);
1396    rps->setNumRefIdc(0);
1397}
1398}
1399
1400   // This is a function that
1401   // determines what Reference Picture Set to use
1402   // for a specific slice (with POC = POCCurr)
1403Void TEncTop::selectReferencePictureSet(TComSlice* slice, Int POCCurr, Int GOPid )
1404{
1405  slice->setRPSidx(GOPid);
1406  for(Int extraNum=m_iGOPSize; extraNum<m_extraRPSs+m_iGOPSize; extraNum++)
1407  {   
1408    if(m_uiIntraPeriod > 0 && getDecodingRefreshType() > 0)
1409    {
1410      Int POCIndex = POCCurr%m_uiIntraPeriod;
1411      if(POCIndex == 0)
1412      {
1413        POCIndex = m_uiIntraPeriod;
1414      }
1415      if(POCIndex == m_GOPList[extraNum].m_POC)
1416      {
1417        slice->setRPSidx(extraNum);
1418      }
1419    }
1420    else
1421    {
1422      if(POCCurr==m_GOPList[extraNum].m_POC)
1423      {
1424        slice->setRPSidx(extraNum);
1425      }
1426    }
1427  }
1428
1429  if(POCCurr == 1 && slice->getPic()->isField())
1430  {
1431    slice->setRPSidx(m_iGOPSize+m_extraRPSs);
1432  }
1433
1434  slice->setRPS(getSPS()->getRPSList()->getReferencePictureSet(slice->getRPSidx()));
1435  slice->getRPS()->setNumberOfPictures(slice->getRPS()->getNumberOfNegativePictures()+slice->getRPS()->getNumberOfPositivePictures());
1436}
1437
1438Int TEncTop::getReferencePictureSetIdxForSOP(TComSlice* slice, Int POCCurr, Int GOPid )
1439{
1440  int rpsIdx = GOPid;
1441
1442  for(Int extraNum=m_iGOPSize; extraNum<m_extraRPSs+m_iGOPSize; extraNum++)
1443  {   
1444    if(m_uiIntraPeriod > 0 && getDecodingRefreshType() > 0)
1445    {
1446      Int POCIndex = POCCurr%m_uiIntraPeriod;
1447      if(POCIndex == 0)
1448      {
1449        POCIndex = m_uiIntraPeriod;
1450      }
1451      if(POCIndex == m_GOPList[extraNum].m_POC)
1452      {
1453        rpsIdx = extraNum;
1454      }
1455    }
1456    else
1457    {
1458      if(POCCurr==m_GOPList[extraNum].m_POC)
1459      {
1460        rpsIdx = extraNum;
1461      }
1462    }
1463  }
1464
1465  return rpsIdx;
1466}
1467
1468Void  TEncTop::xInitPPSforTiles()
1469{
1470  m_cPPS.setUniformSpacingFlag( m_iUniformSpacingIdr );
1471  m_cPPS.setNumColumnsMinus1( m_iNumColumnsMinus1 );
1472  m_cPPS.setNumRowsMinus1( m_iNumRowsMinus1 );
1473  if( m_iUniformSpacingIdr == 0 )
1474  {
1475    m_cPPS.setColumnWidth( m_puiColumnWidth );
1476    m_cPPS.setRowHeight( m_puiRowHeight );
1477  }
1478  m_cPPS.setLoopFilterAcrossTilesEnabledFlag( m_loopFilterAcrossTilesEnabledFlag );
1479
1480  // # substreams is "per tile" when tiles are independent.
1481  if (m_iWaveFrontSynchro
1482    )
1483  {
1484    m_cPPS.setNumSubstreams(m_iWaveFrontSubstreams * (m_iNumColumnsMinus1+1));
1485  }
1486}
1487
1488Void  TEncCfg::xCheckGSParameters()
1489{
1490  Int   iWidthInCU = ( m_iSourceWidth%g_uiMaxCUWidth ) ? m_iSourceWidth/g_uiMaxCUWidth + 1 : m_iSourceWidth/g_uiMaxCUWidth;
1491  Int   iHeightInCU = ( m_iSourceHeight%g_uiMaxCUHeight ) ? m_iSourceHeight/g_uiMaxCUHeight + 1 : m_iSourceHeight/g_uiMaxCUHeight;
1492  UInt  uiCummulativeColumnWidth = 0;
1493  UInt  uiCummulativeRowHeight = 0;
1494
1495  //check the column relative parameters
1496  if( m_iNumColumnsMinus1 >= (1<<(LOG2_MAX_NUM_COLUMNS_MINUS1+1)) )
1497  {
1498    printf( "The number of columns is larger than the maximum allowed number of columns.\n" );
1499    exit( EXIT_FAILURE );
1500  }
1501
1502  if( m_iNumColumnsMinus1 >= iWidthInCU )
1503  {
1504    printf( "The current picture can not have so many columns.\n" );
1505    exit( EXIT_FAILURE );
1506  }
1507
1508  if( m_iNumColumnsMinus1 && m_iUniformSpacingIdr==0 )
1509  {
1510    for(Int i=0; i<m_iNumColumnsMinus1; i++)
1511    {
1512      uiCummulativeColumnWidth += m_puiColumnWidth[i];
1513    }
1514
1515    if( uiCummulativeColumnWidth >= iWidthInCU )
1516    {
1517      printf( "The width of the column is too large.\n" );
1518      exit( EXIT_FAILURE );
1519    }
1520  }
1521
1522  //check the row relative parameters
1523  if( m_iNumRowsMinus1 >= (1<<(LOG2_MAX_NUM_ROWS_MINUS1+1)) )
1524  {
1525    printf( "The number of rows is larger than the maximum allowed number of rows.\n" );
1526    exit( EXIT_FAILURE );
1527  }
1528
1529  if( m_iNumRowsMinus1 >= iHeightInCU )
1530  {
1531    printf( "The current picture can not have so many rows.\n" );
1532    exit( EXIT_FAILURE );
1533  }
1534
1535  if( m_iNumRowsMinus1 && m_iUniformSpacingIdr==0 )
1536  {
1537    for(Int i=0; i<m_iNumRowsMinus1; i++)
1538    {
1539      uiCummulativeRowHeight += m_puiRowHeight[i];
1540    }
1541
1542    if( uiCummulativeRowHeight >= iHeightInCU )
1543    {
1544      printf( "The height of the row is too large.\n" );
1545      exit( EXIT_FAILURE );
1546    }
1547  }
1548}
1549
1550#if SVC_EXTENSION
1551#if VPS_EXTN_DIRECT_REF_LAYERS
1552TEncTop* TEncTop::getRefLayerEnc( UInt refLayerIdc )
1553{
1554  if( m_ppcTEncTop[m_layerId]->getNumDirectRefLayers() <= 0 )
1555  {
1556    return (TEncTop *)getLayerEnc( 0 );
1557  }
1558
1559  return (TEncTop *)getLayerEnc( m_cVPS.getRefLayerId( m_layerId, refLayerIdc ) );
1560}
1561#endif
1562
1563#if !REPN_FORMAT_IN_VPS
1564Void TEncTop::xInitILRP()
1565{
1566  if(m_layerId>0)
1567  {
1568    g_bitDepthY     = m_cSPS.getBitDepthY();
1569    g_bitDepthC     = m_cSPS.getBitDepthC();
1570    g_uiMaxCUWidth  = m_cSPS.getMaxCUWidth();
1571    g_uiMaxCUHeight = m_cSPS.getMaxCUHeight();
1572    g_uiMaxCUDepth  = m_cSPS.getMaxCUDepth();
1573    g_uiAddCUDepth  = max (0, m_cSPS.getLog2MinCodingBlockSize() - (Int)m_cSPS.getQuadtreeTULog2MinSize() );
1574
1575    Int  numReorderPics[MAX_TLAYER];
1576    Window &conformanceWindow = m_cSPS.getConformanceWindow();
1577    Window defaultDisplayWindow = m_cSPS.getVuiParametersPresentFlag() ? m_cSPS.getVuiParameters()->getDefaultDisplayWindow() : Window();
1578
1579    if (m_cIlpPic[0] == NULL)
1580    {
1581      for (Int j=0; j < m_numLayer; j++) // consider to set to NumDirectRefLayers[LayerIdInVps[nuh_layer_id]]
1582      {
1583        m_cIlpPic[j] = new  TComPic;
1584#if SVC_UPSAMPLING
1585#if AUXILIARY_PICTURES
1586        m_cIlpPic[j]->create(m_iSourceWidth, m_iSourceHeight, m_chromaFormatIDC, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, conformanceWindow, defaultDisplayWindow, numReorderPics, &m_cSPS, true);
1587#else
1588        m_cIlpPic[j]->create(m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, conformanceWindow, defaultDisplayWindow, numReorderPics, &m_cSPS, true);
1589#endif
1590#else
1591        m_cIlpPic[j]->create(m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, conformanceWindow, defaultDisplayWindow, numReorderPics, true);
1592#endif
1593        for (Int i=0; i<m_cIlpPic[j]->getPicSym()->getNumberOfCUsInFrame(); i++)
1594        {
1595          m_cIlpPic[j]->getPicSym()->getCU(i)->initCU(m_cIlpPic[j], i);
1596        }
1597      }
1598    }
1599  }
1600}
1601#else
1602Void TEncTop::xInitILRP()
1603{
1604#if O0096_REP_FORMAT_INDEX
1605  RepFormat *repFormat = m_cVPS.getVpsRepFormat( m_cVPS.getVpsRepFormatIdx( m_cSPS.getUpdateRepFormatFlag() ? m_cSPS.getUpdateRepFormatIndex() : m_layerId ) );
1606#else
1607  RepFormat *repFormat = m_cVPS.getVpsRepFormat( m_cVPS.getVpsRepFormatIdx( m_layerId ) );
1608#endif
1609  Int bitDepthY,bitDepthC,picWidth,picHeight;
1610
1611#if O0096_REP_FORMAT_INDEX
1612  bitDepthY   = repFormat->getBitDepthVpsLuma();
1613  bitDepthC   = repFormat->getBitDepthVpsChroma();
1614  picWidth    = repFormat->getPicWidthVpsInLumaSamples();
1615  picHeight   = repFormat->getPicHeightVpsInLumaSamples();
1616#else
1617  if( m_cSPS.getUpdateRepFormatFlag() )
1618  {
1619    bitDepthY   = m_cSPS.getBitDepthY();
1620    bitDepthC   = m_cSPS.getBitDepthC();
1621    picWidth    = m_cSPS.getPicWidthInLumaSamples();
1622    picHeight   = m_cSPS.getPicHeightInLumaSamples();
1623  }
1624  else
1625  {
1626    bitDepthY   = repFormat->getBitDepthVpsLuma();
1627    bitDepthC   = repFormat->getBitDepthVpsChroma();
1628    picWidth    = repFormat->getPicWidthVpsInLumaSamples();
1629    picHeight   = repFormat->getPicHeightVpsInLumaSamples();
1630  }
1631#endif
1632 
1633  if(m_layerId > 0)
1634  {
1635    g_bitDepthY     = bitDepthY;
1636    g_bitDepthC     = bitDepthC;
1637    g_uiMaxCUWidth  = m_cSPS.getMaxCUWidth();
1638    g_uiMaxCUHeight = m_cSPS.getMaxCUHeight();
1639    g_uiMaxCUDepth  = m_cSPS.getMaxCUDepth();
1640    g_uiAddCUDepth  = max (0, m_cSPS.getLog2MinCodingBlockSize() - (Int)m_cSPS.getQuadtreeTULog2MinSize() );
1641
1642    Int  numReorderPics[MAX_TLAYER];
1643    Window &conformanceWindow = m_cSPS.getConformanceWindow();
1644    Window defaultDisplayWindow = m_cSPS.getVuiParametersPresentFlag() ? m_cSPS.getVuiParameters()->getDefaultDisplayWindow() : Window();
1645
1646    if (m_cIlpPic[0] == NULL)
1647    {
1648      for (Int j=0; j < m_numDirectRefLayers; j++)
1649      {
1650        m_cIlpPic[j] = new  TComPic;
1651#if SVC_UPSAMPLING
1652#if AUXILIARY_PICTURES
1653        m_cIlpPic[j]->create(picWidth, picHeight, m_chromaFormatIDC, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, conformanceWindow, defaultDisplayWindow, numReorderPics, &m_cSPS, true);
1654#else
1655        m_cIlpPic[j]->create(picWidth, picHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, conformanceWindow, defaultDisplayWindow, numReorderPics, &m_cSPS, true);
1656#endif
1657#else
1658        m_cIlpPic[j]->create(m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, conformanceWindow, defaultDisplayWindow, numReorderPics, true);
1659#endif
1660        for (Int i=0; i<m_cIlpPic[j]->getPicSym()->getNumberOfCUsInFrame(); i++)
1661        {
1662          m_cIlpPic[j]->getPicSym()->getCU(i)->initCU(m_cIlpPic[j], i);
1663        }
1664      }
1665    }
1666  }
1667}
1668#endif
1669
1670#if O0098_SCALED_REF_LAYER_ID
1671Window& TEncTop::getScaledRefLayerWindowForLayer(Int layerId)
1672{
1673  static Window win;
1674
1675  for (Int i = 0; i < m_numScaledRefLayerOffsets; i++)
1676  {
1677    if (layerId == m_scaledRefLayerId[i])
1678    {
1679      return m_scaledRefLayerWindow[i];
1680    }
1681  }
1682
1683  win.resetWindow();  // scaled reference layer offsets are inferred to be zero when not present
1684  return win;
1685}
1686#endif
1687
1688#endif //SVC_EXTENSION
1689//! \}
Note: See TracBrowser for help on using the repository browser.