source: SHVCSoftware/branches/SHM-dev/source/Lib/TLibEncoder/TEncTop.cpp @ 873

Last change on this file since 873 was 873, checked in by sharp, 10 years ago

Resampling bugfix -- (1) fix resampling bypass flag, (2) conformance check on resampling params
(Macro: RESAMPLING_FIX)

From: Tomoyuki Yamamoto <yamamoto.tomoyuki@…>

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