source: SHVCSoftware/trunk/source/Lib/TLibDecoder/TDecTop.cpp @ 186

Last change on this file since 186 was 125, checked in by seregin, 12 years ago

copy from HM-10.0-dev-SHM

File size: 38.0 KB
RevLine 
[125]1/* The copyright in this software is being made available under the BSD
2 * License, included below. This software may be subject to other third party
3 * and contributor rights, including patent rights, and no such rights are
4 * granted under this license. 
5 *
6 * Copyright (c) 2010-2013, ITU/ISO/IEC
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions are met:
11 *
12 *  * Redistributions of source code must retain the above copyright notice,
13 *    this list of conditions and the following disclaimer.
14 *  * Redistributions in binary form must reproduce the above copyright notice,
15 *    this list of conditions and the following disclaimer in the documentation
16 *    and/or other materials provided with the distribution.
17 *  * Neither the name of the ITU/ISO/IEC nor the names of its contributors may
18 *    be used to endorse or promote products derived from this software without
19 *    specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
25 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
31 * THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34/** \file     TDecTop.cpp
35    \brief    decoder class
36*/
37
38#include "NALread.h"
39#include "TDecTop.h"
40
41#if SVC_EXTENSION
42UInt  TDecTop::m_prevPOC = MAX_UINT;
43UInt  TDecTop::m_uiPrevLayerId = MAX_UINT;
44Bool  TDecTop::m_bFirstSliceInSequence = true;
45#endif
46
47//! \ingroup TLibDecoder
48//! \{
49
50TDecTop::TDecTop()
51{
52  m_pcPic = 0;
53  m_iMaxRefPicNum = 0;
54#if ENC_DEC_TRACE
55  g_hTrace = fopen( "TraceDec.txt", "wb" );
56  g_bJustDoIt = g_bEncDecTraceDisable;
57  g_nSymbolCounter = 0;
58#endif
59  m_pocCRA = 0;
60  m_prevRAPisBLA = false;
61  m_pocRandomAccess = MAX_INT;         
62#if !SVC_EXTENSION
63  m_prevPOC                = MAX_INT;
64#endif
65  m_bFirstSliceInPicture    = true;
66#if !SVC_EXTENSION
67  m_bFirstSliceInSequence   = true;
68#endif
69#if SVC_EXTENSION
70  m_layerId = 0;
71#if AVC_BASE
72  m_pBLReconFile = NULL;
73#endif
74#endif
75#if REF_IDX_FRAMEWORK
76  memset(m_cIlpPic, 0, sizeof(m_cIlpPic));
77#endif
78#if AVC_SYNTAX || SYNTAX_OUTPUT
79  m_pBLSyntaxFile = NULL;
80#endif
81
82}
83
84TDecTop::~TDecTop()
85{
86#if ENC_DEC_TRACE
87  fclose( g_hTrace );
88#endif
89}
90
91Void TDecTop::create()
92{
93#if SVC_EXTENSION
94  m_cGopDecoder.create( m_layerId );
95#else
96  m_cGopDecoder.create();
97#endif
98  m_apcSlicePilot = new TComSlice;
99  m_uiSliceIdx = 0;
100}
101
102Void TDecTop::destroy()
103{
104  m_cGopDecoder.destroy();
105 
106  delete m_apcSlicePilot;
107  m_apcSlicePilot = NULL;
108 
109  m_cSliceDecoder.destroy();
110#if REF_IDX_FRAMEWORK
111  for(Int i=0; i<MAX_NUM_REF; i++)
112  {
113    if(m_cIlpPic[i])
114    {
115      //m_cIlpPic[i]->setPicYuvRec(NULL);
116      m_cIlpPic[i]->destroy();
117      delete m_cIlpPic[i];
118      m_cIlpPic[i] = NULL;
119    }
120  }   
121#endif
122}
123
124Void TDecTop::init()
125{
126#if !SVC_EXTENSION
127  // initialize ROM
128  initROM();
129#endif
130#if SVC_EXTENSION
131  m_cGopDecoder.init( m_ppcTDecTop, &m_cEntropyDecoder, &m_cSbacDecoder, &m_cBinCABAC, &m_cCavlcDecoder, &m_cSliceDecoder, &m_cLoopFilter, &m_cSAO);
132  m_cSliceDecoder.init( m_ppcTDecTop, &m_cEntropyDecoder, &m_cCuDecoder );
133#else
134  m_cGopDecoder.init( &m_cEntropyDecoder, &m_cSbacDecoder, &m_cBinCABAC, &m_cCavlcDecoder, &m_cSliceDecoder, &m_cLoopFilter, &m_cSAO);
135  m_cSliceDecoder.init( &m_cEntropyDecoder, &m_cCuDecoder );
136#endif
137  m_cEntropyDecoder.init(&m_cPrediction);
138}
139
140#if REF_IDX_FRAMEWORK
141Void TDecTop::xInitILRP(TComSPS *pcSPS)
142{
143  if(m_layerId>0)
144  {
145    Int  numReorderPics[MAX_TLAYER];
146    Window &conformanceWindow = pcSPS->getConformanceWindow();
147    Window defaultDisplayWindow = pcSPS->getVuiParametersPresentFlag() ? pcSPS->getVuiParameters()->getDefaultDisplayWindow() : Window();
148
149    for( Int temporalLayer=0; temporalLayer < MAX_TLAYER; temporalLayer++) 
150    {
151      numReorderPics[temporalLayer] = pcSPS->getNumReorderPics(temporalLayer);
152    }
153
154    if (m_cIlpPic[0] == NULL)
155    {
156      for (Int j=0; j<1/*MAX_NUM_REF*/; j++)
157      {
158        m_cIlpPic[j] = new  TComPic;
159        //m_cIlpPic[j]->createWithOutYuv(m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, &m_cSPS, true);
160#if SVC_UPSAMPLING
161        m_cIlpPic[j]->create(pcSPS->getPicWidthInLumaSamples(), pcSPS->getPicHeightInLumaSamples(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, conformanceWindow, defaultDisplayWindow, numReorderPics, pcSPS, true);
162#else
163        m_cIlpPic[j]->create(pcSPS->getPicWidthInLumaSamples(), pcSPS->getPicHeightInLumaSamples(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, conformanceWindow, defaultDisplayWindow, numReorderPics, true);
164#endif
165        for (Int i=0; i<m_cIlpPic[j]->getPicSym()->getNumberOfCUsInFrame(); i++)
166        {
167          m_cIlpPic[j]->getPicSym()->getCU(i)->initCU(m_cIlpPic[j], i);
168        }
169      }
170    }
171  }
172}
173
174Void TDecTop::setILRPic(TComPic *pcPic)
175{
176  if(m_cIlpPic[0])
177  {
178    //m_cIlpPic[0]->setPicYuvRec(pcPic->getFullPelBaseRec());
179    m_cIlpPic[0]->copyUpsampledPictureYuv(pcPic->getFullPelBaseRec(), m_cIlpPic[0]->getPicYuvRec());
180    m_cIlpPic[0]->getSlice(0)->setPOC(pcPic->getPOC());
181    m_cIlpPic[0]->setLayerId(0); //set reference layerId
182    m_cIlpPic[0]->getPicYuvRec()->setBorderExtension(false);
183    m_cIlpPic[0]->getPicYuvRec()->extendPicBorder();
184  }
185}
186#endif
187
188Void TDecTop::deletePicBuffer ( )
189{
190  TComList<TComPic*>::iterator  iterPic   = m_cListPic.begin();
191  Int iSize = Int( m_cListPic.size() );
192 
193  for (Int i = 0; i < iSize; i++ )
194  {
195    TComPic* pcPic = *(iterPic++);
196#if SVC_EXTENSION
197    if( pcPic )
198    {
199      pcPic->destroy();
200
201      delete pcPic;
202      pcPic = NULL;
203    }
204#else
205    pcPic->destroy();
206   
207    delete pcPic;
208    pcPic = NULL;
209#endif
210  }
211 
212  m_cSAO.destroy();
213 
214  m_cLoopFilter.        destroy();
215 
216#if !SVC_EXTENSION
217  // destroy ROM
218  destroyROM();
219#endif
220}
221
222Void TDecTop::xGetNewPicBuffer ( TComSlice* pcSlice, TComPic*& rpcPic )
223{
224  Int  numReorderPics[MAX_TLAYER];
225  Window &conformanceWindow = pcSlice->getSPS()->getConformanceWindow();
226  Window defaultDisplayWindow = pcSlice->getSPS()->getVuiParametersPresentFlag() ? pcSlice->getSPS()->getVuiParameters()->getDefaultDisplayWindow() : Window();
227
228  for( Int temporalLayer=0; temporalLayer < MAX_TLAYER; temporalLayer++) 
229  {
230    numReorderPics[temporalLayer] = pcSlice->getSPS()->getNumReorderPics(temporalLayer);
231  }
232
233  m_iMaxRefPicNum = pcSlice->getSPS()->getMaxDecPicBuffering(pcSlice->getTLayer())+pcSlice->getSPS()->getNumReorderPics(pcSlice->getTLayer()) + 1; // +1 to have space for the picture currently being decoded
234  if (m_cListPic.size() < (UInt)m_iMaxRefPicNum)
235  {
236    rpcPic = new TComPic();
237
238#if SVC_EXTENSION //Temporal solution, should be modified
239    if(m_layerId > 0)
240    {
241      TDecTop *pcTDecTopBase = (TDecTop *)getLayerDec( m_layerId-1 );
242      //TComPic*                      pcPic = *(pcTDecTopBase->getListPic()->begin());
243      TComPicYuv* pcPicYuvRecBase = (*(pcTDecTopBase->getListPic()->begin()))->getPicYuvRec(); 
244      if(pcPicYuvRecBase->getWidth() != pcSlice->getSPS()->getPicWidthInLumaSamples() || pcPicYuvRecBase->getHeight() != pcSlice->getSPS()->getPicHeightInLumaSamples() )
245      {
246        rpcPic->setSpatialEnhLayerFlag( true );
247      }
248    }
249#endif
250   
251#if SVC_UPSAMPLING
252    rpcPic->create ( pcSlice->getSPS()->getPicWidthInLumaSamples(), pcSlice->getSPS()->getPicHeightInLumaSamples(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, 
253                     conformanceWindow, defaultDisplayWindow, numReorderPics, pcSlice->getSPS(), true);
254#else
255    rpcPic->create ( pcSlice->getSPS()->getPicWidthInLumaSamples(), pcSlice->getSPS()->getPicHeightInLumaSamples(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, 
256                     conformanceWindow, defaultDisplayWindow, numReorderPics, true);
257#endif
258    rpcPic->getPicSym()->allocSaoParam(&m_cSAO);
259    m_cListPic.pushBack( rpcPic );
260   
261    return;
262  }
263 
264  Bool bBufferIsAvailable = false;
265  TComList<TComPic*>::iterator  iterPic   = m_cListPic.begin();
266  while (iterPic != m_cListPic.end())
267  {
268    rpcPic = *(iterPic++);
269    if ( rpcPic->getReconMark() == false && rpcPic->getOutputMark() == false)
270    {
271      rpcPic->setOutputMark(false);
272      bBufferIsAvailable = true;
273      break;
274    }
275
276    if ( rpcPic->getSlice( 0 )->isReferenced() == false  && rpcPic->getOutputMark() == false)
277    {
278#if !SVC_EXTENSION
279      rpcPic->setOutputMark(false);
280#endif
281      rpcPic->setReconMark( false );
282      rpcPic->getPicYuvRec()->setBorderExtension( false );
283      bBufferIsAvailable = true;
284      break;
285    }
286  }
287 
288  if ( !bBufferIsAvailable )
289  {
290    //There is no room for this picture, either because of faulty encoder or dropped NAL. Extend the buffer.
291    m_iMaxRefPicNum++;
292    rpcPic = new TComPic();
293    m_cListPic.pushBack( rpcPic );
294  }
295  rpcPic->destroy();
296
297#if SVC_UPSAMPLING
298  rpcPic->create ( pcSlice->getSPS()->getPicWidthInLumaSamples(), pcSlice->getSPS()->getPicHeightInLumaSamples(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth,
299                   conformanceWindow, defaultDisplayWindow, numReorderPics, pcSlice->getSPS(), true);
300
301#else
302  rpcPic->create ( pcSlice->getSPS()->getPicWidthInLumaSamples(), pcSlice->getSPS()->getPicHeightInLumaSamples(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth,
303                   conformanceWindow, defaultDisplayWindow, numReorderPics, true);
304#endif
305  rpcPic->getPicSym()->allocSaoParam(&m_cSAO);
306}
307
308Void TDecTop::executeLoopFilters(Int& poc, TComList<TComPic*>*& rpcListPic)
309{
310  if (!m_pcPic)
311  {
312    /* nothing to deblock */
313    return;
314  }
315 
316  TComPic*&   pcPic         = m_pcPic;
317
318  // Execute Deblock + Cleanup
319
320  m_cGopDecoder.filterPicture(pcPic);
321
322#if SYNTAX_OUTPUT
323  pcPic->wrireBLSyntax( getBLSyntaxFile(), SYNTAX_BYTES );
324#endif
325  TComSlice::sortPicList( m_cListPic ); // sorting for application output
326  poc                 = pcPic->getSlice(m_uiSliceIdx-1)->getPOC();
327  rpcListPic          = &m_cListPic; 
328  m_cCuDecoder.destroy();       
329  m_bFirstSliceInPicture  = true;
330
331  return;
332}
333
334Void TDecTop::xCreateLostPicture(Int iLostPoc) 
335{
336  printf("\ninserting lost poc : %d\n",iLostPoc);
337  TComSlice cFillSlice;
338#if SVC_EXTENSION
339  cFillSlice.setSPS( m_parameterSetManagerDecoder[m_layerId].getFirstSPS() );
340  cFillSlice.setPPS( m_parameterSetManagerDecoder[m_layerId].getFirstPPS() );
341  cFillSlice.initSlice( m_layerId );
342#else
343  cFillSlice.setSPS( m_parameterSetManagerDecoder.getFirstSPS() );
344  cFillSlice.setPPS( m_parameterSetManagerDecoder.getFirstPPS() );
345  cFillSlice.initSlice();
346#endif
347  TComPic *cFillPic;
348  xGetNewPicBuffer(&cFillSlice,cFillPic);
349#if SVC_EXTENSION
350  cFillPic->getSlice(0)->setSPS( m_parameterSetManagerDecoder[m_layerId].getFirstSPS() );
351  cFillPic->getSlice(0)->setPPS( m_parameterSetManagerDecoder[m_layerId].getFirstPPS() );
352  cFillPic->getSlice(0)->initSlice( m_layerId );
353#else
354  cFillPic->getSlice(0)->setSPS( m_parameterSetManagerDecoder.getFirstSPS() );
355  cFillPic->getSlice(0)->setPPS( m_parameterSetManagerDecoder.getFirstPPS() );
356  cFillPic->getSlice(0)->initSlice();
357#endif
358 
359  TComList<TComPic*>::iterator iterPic = m_cListPic.begin();
360  Int closestPoc = 1000000;
361  while ( iterPic != m_cListPic.end())
362  {
363    TComPic * rpcPic = *(iterPic++);
364    if(abs(rpcPic->getPicSym()->getSlice(0)->getPOC() -iLostPoc)<closestPoc&&abs(rpcPic->getPicSym()->getSlice(0)->getPOC() -iLostPoc)!=0&&rpcPic->getPicSym()->getSlice(0)->getPOC()!=m_apcSlicePilot->getPOC())
365    {
366      closestPoc=abs(rpcPic->getPicSym()->getSlice(0)->getPOC() -iLostPoc);
367    }
368  }
369  iterPic = m_cListPic.begin();
370  while ( iterPic != m_cListPic.end())
371  {
372    TComPic *rpcPic = *(iterPic++);
373    if(abs(rpcPic->getPicSym()->getSlice(0)->getPOC() -iLostPoc)==closestPoc&&rpcPic->getPicSym()->getSlice(0)->getPOC()!=m_apcSlicePilot->getPOC())
374    {
375      printf("copying picture %d to %d (%d)\n",rpcPic->getPicSym()->getSlice(0)->getPOC() ,iLostPoc,m_apcSlicePilot->getPOC());
376      rpcPic->getPicYuvRec()->copyToPic(cFillPic->getPicYuvRec());
377      break;
378    }
379  }
380  cFillPic->setCurrSliceIdx(0);
381  for(Int i=0; i<cFillPic->getNumCUsInFrame(); i++) 
382  {
383    cFillPic->getCU(i)->initCU(cFillPic,i);
384  }
385  cFillPic->getSlice(0)->setReferenced(true);
386  cFillPic->getSlice(0)->setPOC(iLostPoc);
387  cFillPic->setReconMark(true);
388  cFillPic->setOutputMark(true);
389  if(m_pocRandomAccess == MAX_INT)
390  {
391    m_pocRandomAccess = iLostPoc;
392  }
393}
394
395
396Void TDecTop::xActivateParameterSets()
397{
398#if SVC_EXTENSION
399  m_parameterSetManagerDecoder[m_layerId].applyPrefetchedPS();
400 
401  TComPPS *pps = m_parameterSetManagerDecoder[m_layerId].getPPS(m_apcSlicePilot->getPPSId());
402  assert (pps != 0);
403
404  TComSPS *sps = m_parameterSetManagerDecoder[m_layerId].getSPS(pps->getSPSId());
405  assert (sps != 0);
406
407  if( false == m_parameterSetManagerDecoder[m_layerId].activatePPS(m_apcSlicePilot->getPPSId(), m_apcSlicePilot->getIdrPicFlag()) )
408#else
409  m_parameterSetManagerDecoder.applyPrefetchedPS();
410 
411  TComPPS *pps = m_parameterSetManagerDecoder.getPPS(m_apcSlicePilot->getPPSId());
412  assert (pps != 0);
413
414  TComSPS *sps = m_parameterSetManagerDecoder.getSPS(pps->getSPSId());
415  assert (sps != 0);
416
417  if (false == m_parameterSetManagerDecoder.activatePPS(m_apcSlicePilot->getPPSId(),m_apcSlicePilot->getIdrPicFlag()))
418#endif
419  {
420    printf ("Parameter set activation failed!");
421    assert (0);
422  }
423
424  m_apcSlicePilot->setPPS(pps);
425  m_apcSlicePilot->setSPS(sps);
426  pps->setSPS(sps);
427  pps->setNumSubstreams(pps->getEntropyCodingSyncEnabledFlag() ? ((sps->getPicHeightInLumaSamples() + sps->getMaxCUHeight() - 1) / sps->getMaxCUHeight()) * (pps->getNumColumnsMinus1() + 1) : 1);
428  pps->setMinCuDQPSize( sps->getMaxCUWidth() >> ( pps->getMaxCuDQPDepth()) );
429
430  for (Int i = 0; i < sps->getMaxCUDepth() - g_uiAddCUDepth; i++)
431  {
432    sps->setAMPAcc( i, sps->getUseAMP() );
433  }
434
435  for (Int i = sps->getMaxCUDepth() - g_uiAddCUDepth; i < sps->getMaxCUDepth(); i++)
436  {
437    sps->setAMPAcc( i, 0 );
438  }
439
440  m_cSAO.destroy();
441  m_cSAO.create( sps->getPicWidthInLumaSamples(), sps->getPicHeightInLumaSamples(), g_uiMaxCUWidth, g_uiMaxCUHeight );
442  m_cLoopFilter.        create( g_uiMaxCUDepth );
443}
444
445#if SVC_EXTENSION
446Bool TDecTop::xDecodeSlice(InputNALUnit &nalu, Int &iSkipFrame, Int iPOCLastDisplay, UInt& curLayerId, Bool& bNewPOC )
447#else
448Bool TDecTop::xDecodeSlice(InputNALUnit &nalu, Int &iSkipFrame, Int iPOCLastDisplay )
449#endif
450{
451  TComPic*&   pcPic         = m_pcPic;
452#if SVC_EXTENSION
453  m_apcSlicePilot->initSlice( nalu.m_layerId );
454#else
455  m_apcSlicePilot->initSlice();
456#endif
457
458  if (m_bFirstSliceInPicture)
459  {
460    m_uiSliceIdx     = 0;
461  }
462  m_apcSlicePilot->setSliceIdx(m_uiSliceIdx);
463  if (!m_bFirstSliceInPicture)
464  {
465    m_apcSlicePilot->copySliceInfo( pcPic->getPicSym()->getSlice(m_uiSliceIdx-1) );
466  }
467
468  m_apcSlicePilot->setNalUnitType(nalu.m_nalUnitType);
469  if((m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_TRAIL_N) ||
470     (m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_TSA_N) ||
471     (m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_STSA_N))
472  {
473    m_apcSlicePilot->setTemporalLayerNonReferenceFlag(true);
474  }
475  m_apcSlicePilot->setReferenced(true); // Putting this as true ensures that picture is referenced the first time it is in an RPS
476  m_apcSlicePilot->setTLayerInfo(nalu.m_temporalId);
477
478#if SVC_EXTENSION
479  m_cEntropyDecoder.decodeSliceHeader (m_apcSlicePilot, &m_parameterSetManagerDecoder[m_layerId]);
480#else
481  m_cEntropyDecoder.decodeSliceHeader (m_apcSlicePilot, &m_parameterSetManagerDecoder);
482#endif
483  if (m_apcSlicePilot->isNextSlice())
484  {
485    // Skip pictures due to random access
486    if (isRandomAccessSkipPicture(iSkipFrame, iPOCLastDisplay))
487    {
488      return false;
489    }
490    // Skip TFD pictures associated with BLA/BLANT pictures
491    if (isSkipPictureForBLA(iPOCLastDisplay))
492    {
493      return false;
494    }
495  } 
496
497  // exit when a new picture is found
498#if SVC_EXTENSION
499  bNewPOC = (m_apcSlicePilot->getPOC()!= m_prevPOC);
500  if (m_apcSlicePilot->isNextSlice() && (bNewPOC || m_layerId!=m_uiPrevLayerId) && !m_bFirstSliceInSequence )
501  {
502    m_prevPOC = m_apcSlicePilot->getPOC();
503    curLayerId = m_uiPrevLayerId; 
504    m_uiPrevLayerId = m_layerId;
505    return true;
506  }
507#else
508  if (m_apcSlicePilot->isNextSlice() && m_apcSlicePilot->getPOC()!=m_prevPOC && !m_bFirstSliceInSequence)
509  {
510    if (m_prevPOC >= m_pocRandomAccess)
511    {
512      m_prevPOC = m_apcSlicePilot->getPOC();
513      return true;
514    }
515    m_prevPOC = m_apcSlicePilot->getPOC();
516  }
517#endif
518  // actual decoding starts here
519  xActivateParameterSets();
520
521  if (m_apcSlicePilot->isNextSlice()) 
522  {
523    m_prevPOC = m_apcSlicePilot->getPOC();
524#if SVC_EXTENSION
525    curLayerId = m_layerId;
526    m_uiPrevLayerId = m_layerId;
527#endif
528  }
529  m_bFirstSliceInSequence = false;
530  //detect lost reference picture and insert copy of earlier frame.
531  Int lostPoc;
532  while((lostPoc=m_apcSlicePilot->checkThatAllRefPicsAreAvailable(m_cListPic, m_apcSlicePilot->getRPS(), true, m_pocRandomAccess)) > 0)
533  {
534    xCreateLostPicture(lostPoc-1);
535  }
536  if (m_bFirstSliceInPicture)
537  {
538#if AVC_BASE
539  if( m_layerId == 1 )
540  {
541    TComPic* pBLPic = (*m_ppcTDecTop[0]->getListPic()->begin());
542    fstream* pFile  = m_ppcTDecTop[0]->getBLReconFile();
543    const Window &conf = pBLPic->getConformanceWindow();
544    UInt uiWidth    = pBLPic->getPicYuvRec()->getWidth() - conf.getWindowLeftOffset() - conf.getWindowRightOffset();
545    UInt uiHeight   = pBLPic->getPicYuvRec()->getHeight() - conf.getWindowTopOffset() - conf.getWindowBottomOffset();
546       
547    if( pFile->good() )
548    {
549      UInt64 uiPos = (UInt64) m_apcSlicePilot->getPOC() * uiWidth * uiHeight * 3 / 2;
550
551      pFile->seekg((UInt)uiPos, ios::beg );
552
553      Pel* pPel = pBLPic->getPicYuvRec()->getLumaAddr();
554      UInt uiStride = pBLPic->getPicYuvRec()->getStride();
555      for( Int i = 0; i < uiHeight; i++ )
556      {
557        for( Int j = 0; j < uiWidth; j++ )
558        {
559          pPel[j] = pFile->get();
560        }
561        pPel += uiStride;
562      }
563
564      pPel = pBLPic->getPicYuvRec()->getCbAddr();
565      uiStride = pBLPic->getPicYuvRec()->getCStride();
566      for( Int i = 0; i < uiHeight/2; i++ )
567      {
568        for( Int j = 0; j < uiWidth/2; j++ )
569        {
570          pPel[j] = pFile->get();
571        }
572        pPel += uiStride;
573      }
574
575      pPel = pBLPic->getPicYuvRec()->getCrAddr();
576      uiStride = pBLPic->getPicYuvRec()->getCStride();
577      for( Int i = 0; i < uiHeight/2; i++ )
578      {
579        for( Int j = 0; j < uiWidth/2; j++ )
580        {
581          pPel[j] = pFile->get();
582        }
583        pPel += uiStride;
584      }
585    }
586  }
587#endif
588
589    // Buffer initialize for prediction.
590    m_cPrediction.initTempBuff();
591    m_apcSlicePilot->applyReferencePictureSet(m_cListPic, m_apcSlicePilot->getRPS());
592    //  Get a new picture buffer
593    xGetNewPicBuffer (m_apcSlicePilot, pcPic);
594
595    // transfer any SEI messages that have been received to the picture
596    pcPic->setSEIs(m_SEIs);
597    m_SEIs.clear();
598
599    // Recursive structure
600    m_cCuDecoder.create ( g_uiMaxCUDepth, g_uiMaxCUWidth, g_uiMaxCUHeight );
601#if SVC_EXTENSION
602    m_cCuDecoder.init   ( m_ppcTDecTop,&m_cEntropyDecoder, &m_cTrQuant, &m_cPrediction, curLayerId );
603#else
604    m_cCuDecoder.init   ( &m_cEntropyDecoder, &m_cTrQuant, &m_cPrediction );
605#endif
606    m_cTrQuant.init     ( g_uiMaxCUWidth, g_uiMaxCUHeight, m_apcSlicePilot->getSPS()->getMaxTrSize());
607
608    m_cSliceDecoder.create();
609  }
610  else
611  {
612    // Check if any new SEI has arrived
613    if(!m_SEIs.empty())
614    {
615      // Currently only decoding Unit SEI message occurring between VCL NALUs copied
616      SEIMessages &picSEI = pcPic->getSEIs();
617      SEIMessages decodingUnitInfos = extractSeisByType (m_SEIs, SEI::DECODING_UNIT_INFO);
618      picSEI.insert(picSEI.end(), decodingUnitInfos.begin(), decodingUnitInfos.end());
619      deleteSEIs(m_SEIs);
620    }
621  }
622 
623  //  Set picture slice pointer
624  TComSlice*  pcSlice = m_apcSlicePilot;
625  Bool bNextSlice     = pcSlice->isNextSlice();
626
627  UInt uiCummulativeTileWidth;
628  UInt uiCummulativeTileHeight;
629  UInt i, j, p;
630
631  //set NumColumnsMins1 and NumRowsMinus1
632  pcPic->getPicSym()->setNumColumnsMinus1( pcSlice->getPPS()->getNumColumnsMinus1() );
633  pcPic->getPicSym()->setNumRowsMinus1( pcSlice->getPPS()->getNumRowsMinus1() );
634
635  //create the TComTileArray
636  pcPic->getPicSym()->xCreateTComTileArray();
637
638  if( pcSlice->getPPS()->getUniformSpacingFlag() )
639  {
640    //set the width for each tile
641    for(j=0; j < pcPic->getPicSym()->getNumRowsMinus1()+1; j++)
642    {
643      for(p=0; p < pcPic->getPicSym()->getNumColumnsMinus1()+1; p++)
644      {
645        pcPic->getPicSym()->getTComTile( j * (pcPic->getPicSym()->getNumColumnsMinus1()+1) + p )->
646          setTileWidth( (p+1)*pcPic->getPicSym()->getFrameWidthInCU()/(pcPic->getPicSym()->getNumColumnsMinus1()+1) 
647          - (p*pcPic->getPicSym()->getFrameWidthInCU())/(pcPic->getPicSym()->getNumColumnsMinus1()+1) );
648      }
649    }
650
651    //set the height for each tile
652    for(j=0; j < pcPic->getPicSym()->getNumColumnsMinus1()+1; j++)
653    {
654      for(p=0; p < pcPic->getPicSym()->getNumRowsMinus1()+1; p++)
655      {
656        pcPic->getPicSym()->getTComTile( p * (pcPic->getPicSym()->getNumColumnsMinus1()+1) + j )->
657          setTileHeight( (p+1)*pcPic->getPicSym()->getFrameHeightInCU()/(pcPic->getPicSym()->getNumRowsMinus1()+1) 
658          - (p*pcPic->getPicSym()->getFrameHeightInCU())/(pcPic->getPicSym()->getNumRowsMinus1()+1) );   
659      }
660    }
661  }
662  else
663  {
664    //set the width for each tile
665    for(j=0; j < pcSlice->getPPS()->getNumRowsMinus1()+1; j++)
666    {
667      uiCummulativeTileWidth = 0;
668      for(i=0; i < pcSlice->getPPS()->getNumColumnsMinus1(); i++)
669      {
670        pcPic->getPicSym()->getTComTile(j * (pcSlice->getPPS()->getNumColumnsMinus1()+1) + i)->setTileWidth( pcSlice->getPPS()->getColumnWidth(i) );
671        uiCummulativeTileWidth += pcSlice->getPPS()->getColumnWidth(i);
672      }
673      pcPic->getPicSym()->getTComTile(j * (pcSlice->getPPS()->getNumColumnsMinus1()+1) + i)->setTileWidth( pcPic->getPicSym()->getFrameWidthInCU()-uiCummulativeTileWidth );
674    }
675
676    //set the height for each tile
677    for(j=0; j < pcSlice->getPPS()->getNumColumnsMinus1()+1; j++)
678    {
679      uiCummulativeTileHeight = 0;
680      for(i=0; i < pcSlice->getPPS()->getNumRowsMinus1(); i++)
681      { 
682        pcPic->getPicSym()->getTComTile(i * (pcSlice->getPPS()->getNumColumnsMinus1()+1) + j)->setTileHeight( pcSlice->getPPS()->getRowHeight(i) );
683        uiCummulativeTileHeight += pcSlice->getPPS()->getRowHeight(i);
684      }
685      pcPic->getPicSym()->getTComTile(i * (pcSlice->getPPS()->getNumColumnsMinus1()+1) + j)->setTileHeight( pcPic->getPicSym()->getFrameHeightInCU()-uiCummulativeTileHeight );
686    }
687  }
688
689  pcPic->getPicSym()->xInitTiles();
690
691  //generate the Coding Order Map and Inverse Coding Order Map
692  UInt uiEncCUAddr;
693  for(i=0, uiEncCUAddr=0; i<pcPic->getPicSym()->getNumberOfCUsInFrame(); i++, uiEncCUAddr = pcPic->getPicSym()->xCalculateNxtCUAddr(uiEncCUAddr))
694  {
695    pcPic->getPicSym()->setCUOrderMap(i, uiEncCUAddr);
696    pcPic->getPicSym()->setInverseCUOrderMap(uiEncCUAddr, i);
697  }
698  pcPic->getPicSym()->setCUOrderMap(pcPic->getPicSym()->getNumberOfCUsInFrame(), pcPic->getPicSym()->getNumberOfCUsInFrame());
699  pcPic->getPicSym()->setInverseCUOrderMap(pcPic->getPicSym()->getNumberOfCUsInFrame(), pcPic->getPicSym()->getNumberOfCUsInFrame());
700
701  //convert the start and end CU addresses of the slice and dependent slice into encoding order
702  pcSlice->setSliceSegmentCurStartCUAddr( pcPic->getPicSym()->getPicSCUEncOrder(pcSlice->getSliceSegmentCurStartCUAddr()) );
703  pcSlice->setSliceSegmentCurEndCUAddr( pcPic->getPicSym()->getPicSCUEncOrder(pcSlice->getSliceSegmentCurEndCUAddr()) );
704  if(pcSlice->isNextSlice())
705  {
706    pcSlice->setSliceCurStartCUAddr(pcPic->getPicSym()->getPicSCUEncOrder(pcSlice->getSliceCurStartCUAddr()));
707    pcSlice->setSliceCurEndCUAddr(pcPic->getPicSym()->getPicSCUEncOrder(pcSlice->getSliceCurEndCUAddr()));
708  }
709
710  if (m_bFirstSliceInPicture) 
711  {
712    if(pcPic->getNumAllocatedSlice() != 1)
713    {
714      pcPic->clearSliceBuffer();
715    }
716  }
717  else
718  {
719    pcPic->allocateNewSlice();
720  }
721  assert(pcPic->getNumAllocatedSlice() == (m_uiSliceIdx + 1));
722  m_apcSlicePilot = pcPic->getPicSym()->getSlice(m_uiSliceIdx); 
723  pcPic->getPicSym()->setSlice(pcSlice, m_uiSliceIdx);
724
725  pcPic->setTLayer(nalu.m_temporalId);
726
727#if SVC_EXTENSION
728  pcPic->setLayerId(nalu.m_layerId);
729  pcSlice->setLayerId(nalu.m_layerId);
730#endif
731
732  if (bNextSlice)
733  {
734    pcSlice->checkCRA(pcSlice->getRPS(), m_pocCRA, m_prevRAPisBLA );
735    // Set reference list
736#if REF_LIST_BUGFIX
737    if (m_layerId == 0)
738    {
739      pcSlice->setRefPicList( m_cListPic );
740    }
741#else
742    pcSlice->setRefPicList( m_cListPic );
743#endif
744
745#if SVC_EXTENSION   
746    if(m_layerId > 0)
747    {
748#if AVC_BASE
749      pcSlice->setBaseColPic ( *m_ppcTDecTop[0]->getListPic()->begin() );
750#if AVC_SYNTAX
751      TComPic* pBLPic = pcSlice->getBaseColPic();
752      if( pcSlice->getPOC() == 0 )
753      {
754        // initialize partition order.
755        UInt* piTmp = &g_auiZscanToRaster[0];
756        initZscanToRaster( pBLPic->getPicSym()->getMaxDepth() + 1, 1, 0, piTmp );
757        initRasterToZscan( pBLPic->getPicSym()->getMaxCUWidth(), pBLPic->getPicSym()->getMaxCUHeight(), pBLPic->getPicSym()->getMaxDepth() + 1 );
758      }     
759      pBLPic->getSlice( 0 )->initBaseLayerRPL( pcSlice );
760      pBLPic->readBLSyntax( m_ppcTDecTop[0]->getBLSyntaxFile(), SYNTAX_BYTES );
761#endif
762
763#else
764      TDecTop *pcTDecTop = (TDecTop *)getLayerDec( m_layerId-1 );
765      TComList<TComPic*> *cListPic = pcTDecTop->getListPic();
766      pcSlice->setBaseColPic ( *cListPic, m_layerId );
767#endif
768#if SVC_UPSAMPLING
769      if ( pcPic->isSpatialEnhLayer())
770      {   
771        m_cPrediction.upsampleBasePic( pcPic->getFullPelBaseRec(), pcSlice->getBaseColPic()->getPicYuvRec(), pcPic->getPicYuvRec() );
772      }
773      else
774      {
775        pcPic->setFullPelBaseRec( pcSlice->getBaseColPic()->getPicYuvRec() );
776      }
777      pcSlice->setFullPelBaseRec ( pcPic->getFullPelBaseRec() );
778#endif
779    }
780#endif
781
782#if REF_IDX_FRAMEWORK
783    if(m_layerId > 0)
784    {
785      setILRPic(pcPic);
786#if REF_IDX_MFM
787      pcSlice->setRefPOCListILP(m_ppcTDecTop[m_layerId]->m_cIlpPic, pcSlice->getBaseColPic());
788#endif
789#if REF_LIST_BUGFIX
790      pcSlice->setRefPicListSvc( m_cListPic, m_cIlpPic);
791#else
792      pcSlice->addRefPicList ( m_cIlpPic, 
793                               1, 
794                               ((pcSlice->getNalUnitType() >= NAL_UNIT_CODED_SLICE_BLA) && 
795                                (pcSlice->getNalUnitType() <= NAL_UNIT_CODED_SLICE_CRA)) ? 0: -1);
796#endif
797    }
798#endif
799
800    // For generalized B
801    // note: maybe not existed case (always L0 is copied to L1 if L1 is empty)
802    if (pcSlice->isInterB() && pcSlice->getNumRefIdx(REF_PIC_LIST_1) == 0)
803    {
804      Int iNumRefIdx = pcSlice->getNumRefIdx(REF_PIC_LIST_0);
805      pcSlice->setNumRefIdx        ( REF_PIC_LIST_1, iNumRefIdx );
806
807      for (Int iRefIdx = 0; iRefIdx < iNumRefIdx; iRefIdx++)
808      {
809        pcSlice->setRefPic(pcSlice->getRefPic(REF_PIC_LIST_0, iRefIdx), REF_PIC_LIST_1, iRefIdx);
810      }
811    }
812    if (!pcSlice->isIntra())
813    {
814      Bool bLowDelay = true;
815      Int  iCurrPOC  = pcSlice->getPOC();
816      Int iRefIdx = 0;
817
818      for (iRefIdx = 0; iRefIdx < pcSlice->getNumRefIdx(REF_PIC_LIST_0) && bLowDelay; iRefIdx++)
819      {
820        if ( pcSlice->getRefPic(REF_PIC_LIST_0, iRefIdx)->getPOC() > iCurrPOC )
821        {
822          bLowDelay = false;
823        }
824      }
825      if (pcSlice->isInterB())
826      {
827        for (iRefIdx = 0; iRefIdx < pcSlice->getNumRefIdx(REF_PIC_LIST_1) && bLowDelay; iRefIdx++)
828        {
829          if ( pcSlice->getRefPic(REF_PIC_LIST_1, iRefIdx)->getPOC() > iCurrPOC )
830          {
831            bLowDelay = false;
832          }
833        }       
834      }
835
836      pcSlice->setCheckLDC(bLowDelay);           
837    }
838
839    //---------------
840    pcSlice->setRefPOCList();
841    pcSlice->setNoBackPredFlag( false );
842    if ( pcSlice->getSliceType() == B_SLICE )
843    {
844      if ( pcSlice->getNumRefIdx(RefPicList( 0 ) ) == pcSlice->getNumRefIdx(RefPicList( 1 ) ) )
845      {
846        pcSlice->setNoBackPredFlag( true );
847        for ( i=0; i < pcSlice->getNumRefIdx(RefPicList( 1 ) ); i++ )
848        {
849          if ( pcSlice->getRefPOC(RefPicList(1), i) != pcSlice->getRefPOC(RefPicList(0), i) ) 
850          {
851            pcSlice->setNoBackPredFlag( false );
852            break;
853          }
854        }
855      }
856    }
857  }
858
859  pcPic->setCurrSliceIdx(m_uiSliceIdx);
860  if(pcSlice->getSPS()->getScalingListFlag())
861  {
862    pcSlice->setScalingList ( pcSlice->getSPS()->getScalingList()  );
863    if(pcSlice->getPPS()->getScalingListPresentFlag())
864    {
865      pcSlice->setScalingList ( pcSlice->getPPS()->getScalingList()  );
866    }
867    pcSlice->getScalingList()->setUseTransformSkip(pcSlice->getPPS()->getUseTransformSkip());
868    if(!pcSlice->getPPS()->getScalingListPresentFlag() && !pcSlice->getSPS()->getScalingListPresentFlag())
869    {
870      pcSlice->setDefaultScalingList();
871    }
872    m_cTrQuant.setScalingListDec(pcSlice->getScalingList());
873    m_cTrQuant.setUseScalingList(true);
874  }
875  else
876  {
877    m_cTrQuant.setFlatScalingList();
878    m_cTrQuant.setUseScalingList(false);
879  }
880
881  //  Decode a picture
882  m_cGopDecoder.decompressSlice(nalu.m_Bitstream, pcPic);
883
884  m_bFirstSliceInPicture = false;
885  m_uiSliceIdx++;
886
887  return false;
888}
889
890Void TDecTop::xDecodeVPS()
891{
892  TComVPS* vps = new TComVPS();
893 
894  m_cEntropyDecoder.decodeVPS( vps );
895#if SVC_EXTENSION
896  m_parameterSetManagerDecoder[0].storePrefetchedVPS(vps);
897#else
898  m_parameterSetManagerDecoder.storePrefetchedVPS(vps); 
899#endif
900}
901
902Void TDecTop::xDecodeSPS()
903{
904  TComSPS* sps = new TComSPS();
905#if SVC_EXTENSION
906  sps->setLayerId(m_layerId);
907#endif
908  m_cEntropyDecoder.decodeSPS( sps );
909#if SVC_EXTENSION
910  m_parameterSetManagerDecoder[m_layerId].storePrefetchedSPS(sps);
911#else
912  m_parameterSetManagerDecoder.storePrefetchedSPS(sps);
913#endif
914#if REF_IDX_FRAMEWORK
915  if(m_numLayer>0)
916  {
917    xInitILRP(sps);
918  }
919#endif
920}
921
922Void TDecTop::xDecodePPS()
923{
924  TComPPS* pps = new TComPPS();
925  m_cEntropyDecoder.decodePPS( pps );
926#if SVC_EXTENSION
927  m_parameterSetManagerDecoder[m_layerId].storePrefetchedPPS( pps );
928#else
929  m_parameterSetManagerDecoder.storePrefetchedPPS( pps );
930#endif
931
932  if( pps->getDependentSliceSegmentsEnabledFlag() )
933  {
934    Int NumCtx = pps->getEntropyCodingSyncEnabledFlag()?2:1;
935    m_cSliceDecoder.initCtxMem(NumCtx);
936    for ( UInt st = 0; st < NumCtx; st++ )
937    {
938      TDecSbac* ctx = NULL;
939      ctx = new TDecSbac;
940      ctx->init( &m_cBinCABAC );
941      m_cSliceDecoder.setCtxMem( ctx, st );
942    }
943  }
944}
945
946Void TDecTop::xDecodeSEI( TComInputBitstream* bs, const NalUnitType nalUnitType )
947{
948#if SVC_EXTENSION
949  if(nalUnitType == NAL_UNIT_SEI_SUFFIX)
950  {
951    m_seiReader.parseSEImessage( bs, m_pcPic->getSEIs(), nalUnitType, m_parameterSetManagerDecoder[m_layerId].getActiveSPS() );
952  }
953  else
954  {
955    m_seiReader.parseSEImessage( bs, m_SEIs, nalUnitType, m_parameterSetManagerDecoder[m_layerId].getActiveSPS() );
956    SEIMessages activeParamSets = getSeisByType(m_SEIs, SEI::ACTIVE_PARAMETER_SETS);
957    if (activeParamSets.size()>0)
958    {
959      SEIActiveParameterSets *seiAps = (SEIActiveParameterSets*)(*activeParamSets.begin());
960      m_parameterSetManagerDecoder[m_layerId].applyPrefetchedPS();
961      assert(seiAps->activeSeqParamSetId.size()>0);
962      if (! m_parameterSetManagerDecoder[m_layerId].activateSPSWithSEI(seiAps->activeSeqParamSetId[0] ))
963      {
964        printf ("Warning SPS activation with Active parameter set SEI failed");
965      }
966    }
967  }
968#else
969  if(nalUnitType == NAL_UNIT_SEI_SUFFIX)
970  {
971    m_seiReader.parseSEImessage( bs, m_pcPic->getSEIs(), nalUnitType, m_parameterSetManagerDecoder.getActiveSPS() );
972  }
973  else
974  {
975    m_seiReader.parseSEImessage( bs, m_SEIs, nalUnitType, m_parameterSetManagerDecoder.getActiveSPS() );
976    SEIMessages activeParamSets = getSeisByType(m_SEIs, SEI::ACTIVE_PARAMETER_SETS);
977    if (activeParamSets.size()>0)
978    {
979      SEIActiveParameterSets *seiAps = (SEIActiveParameterSets*)(*activeParamSets.begin());
980      m_parameterSetManagerDecoder.applyPrefetchedPS();
981      assert(seiAps->activeSeqParamSetId.size()>0);
982      if (! m_parameterSetManagerDecoder.activateSPSWithSEI(seiAps->activeSeqParamSetId[0] ))
983      {
984        printf ("Warning SPS activation with Active parameter set SEI failed");
985      }
986    }
987  }
988#endif
989}
990
991#if SVC_EXTENSION
992Bool TDecTop::decode(InputNALUnit& nalu, Int& iSkipFrame, Int& iPOCLastDisplay, UInt& curLayerId, Bool& bNewPOC)
993#else
994Bool TDecTop::decode(InputNALUnit& nalu, Int& iSkipFrame, Int& iPOCLastDisplay)
995#endif
996{
997  // Initialize entropy decoder
998  m_cEntropyDecoder.setEntropyDecoder (&m_cCavlcDecoder);
999  m_cEntropyDecoder.setBitstream      (nalu.m_Bitstream);
1000
1001  switch (nalu.m_nalUnitType)
1002  {
1003    case NAL_UNIT_VPS:
1004      xDecodeVPS();
1005      return false;
1006     
1007    case NAL_UNIT_SPS:
1008      xDecodeSPS();
1009#if AVC_BASE
1010      {
1011        TComPic* pBLPic = (*m_ppcTDecTop[0]->getListPic()->begin());
1012        if( nalu.m_layerId == 1 && pBLPic->getPicYuvRec() == NULL )
1013        {
1014          TComSPS* sps = new TComSPS();
1015          Int  numReorderPics[MAX_TLAYER];
1016          Window &conformanceWindow = sps->getConformanceWindow();
1017          Window defaultDisplayWindow = sps->getVuiParametersPresentFlag() ? sps->getVuiParameters()->getDefaultDisplayWindow() : Window();
1018#if SVC_UPSAMPLING
1019#if AVC_SYNTAX
1020
1021          pBLPic->create( m_ppcTDecTop[0]->getBLWidth(), m_ppcTDecTop[0]->getBLHeight(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, conformanceWindow, defaultDisplayWindow, numReorderPics, sps, true);
1022#else
1023          pBLPic->create( m_ppcTDecTop[0]->getBLWidth(), m_ppcTDecTop[0]->getBLHeight(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, conformanceWindow, defaultDisplayWindow, numReorderPics, NULL, true);
1024#endif
1025#else
1026          pBLPic->create( m_ppcTDecTop[0]->getBLWidth(), m_ppcTDecTop[0]->getBLHeight(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, onformanceWindow, defaultDisplayWindow, numReorderPics, true);
1027#endif
1028        }
1029      }
1030#endif
1031      return false;
1032
1033    case NAL_UNIT_PPS:
1034      xDecodePPS();
1035      return false;
1036     
1037    case NAL_UNIT_SEI:
1038    case NAL_UNIT_SEI_SUFFIX:
1039      xDecodeSEI( nalu.m_Bitstream, nalu.m_nalUnitType );
1040      return false;
1041
1042    case NAL_UNIT_CODED_SLICE_TRAIL_R:
1043    case NAL_UNIT_CODED_SLICE_TRAIL_N:
1044    case NAL_UNIT_CODED_SLICE_TLA:
1045    case NAL_UNIT_CODED_SLICE_TSA_N:
1046    case NAL_UNIT_CODED_SLICE_STSA_R:
1047    case NAL_UNIT_CODED_SLICE_STSA_N:
1048    case NAL_UNIT_CODED_SLICE_BLA:
1049    case NAL_UNIT_CODED_SLICE_BLANT:
1050    case NAL_UNIT_CODED_SLICE_BLA_N_LP:
1051    case NAL_UNIT_CODED_SLICE_IDR:
1052    case NAL_UNIT_CODED_SLICE_IDR_N_LP:
1053    case NAL_UNIT_CODED_SLICE_CRA:
1054    case NAL_UNIT_CODED_SLICE_RADL_N:
1055    case NAL_UNIT_CODED_SLICE_DLP:
1056    case NAL_UNIT_CODED_SLICE_RASL_N:
1057    case NAL_UNIT_CODED_SLICE_TFD:
[2]1058#if SVC_EXTENSION
1059      return xDecodeSlice(nalu, iSkipFrame, iPOCLastDisplay, curLayerId, bNewPOC);
[125]1060#else
1061      return xDecodeSlice(nalu, iSkipFrame, iPOCLastDisplay);
1062#endif
1063      break;
1064    default:
1065      assert (1);
1066  }
1067
1068  return false;
1069}
1070
1071/** Function for checking if picture should be skipped because of association with a previous BLA picture
1072 * \param iPOCLastDisplay POC of last picture displayed
1073 * \returns true if the picture should be skipped
1074 * This function skips all TFD pictures that follow a BLA picture
1075 * in decoding order and precede it in output order.
1076 */
1077Bool TDecTop::isSkipPictureForBLA(Int& iPOCLastDisplay)
1078{
1079  if (m_prevRAPisBLA && m_apcSlicePilot->getPOC() < m_pocCRA && (m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_TFD || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_RASL_N))
1080  {
1081    iPOCLastDisplay++;
1082    return true;
1083  }
1084  return false;
1085}
1086
1087/** Function for checking if picture should be skipped because of random access
1088 * \param iSkipFrame skip frame counter
1089 * \param iPOCLastDisplay POC of last picture displayed
1090 * \returns true if the picture shold be skipped in the random access.
1091 * This function checks the skipping of pictures in the case of -s option random access.
1092 * All pictures prior to the random access point indicated by the counter iSkipFrame are skipped.
1093 * It also checks the type of Nal unit type at the random access point.
1094 * If the random access point is CRA/CRANT/BLA/BLANT, TFD pictures with POC less than the POC of the random access point are skipped.
1095 * If the random access point is IDR all pictures after the random access point are decoded.
1096 * If the random access point is none of the above, a warning is issues, and decoding of pictures with POC
1097 * equal to or greater than the random access point POC is attempted. For non IDR/CRA/BLA random
1098 * access point there is no guarantee that the decoder will not crash.
1099 */
1100Bool TDecTop::isRandomAccessSkipPicture(Int& iSkipFrame,  Int& iPOCLastDisplay)
1101{
1102  if (iSkipFrame) 
1103  {
1104    iSkipFrame--;   // decrement the counter
1105    return true;
1106  }
1107  else if (m_pocRandomAccess == MAX_INT) // start of random access point, m_pocRandomAccess has not been set yet.
1108  {
1109    if (   m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA
1110        || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA
1111        || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_N_LP
1112        || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_BLANT )
1113    {
1114      // set the POC random access since we need to skip the reordered pictures in the case of CRA/CRANT/BLA/BLANT.
1115      m_pocRandomAccess = m_apcSlicePilot->getPOC();
1116    }
1117    else if ( m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_N_LP )
1118    {
1119      m_pocRandomAccess = -MAX_INT; // no need to skip the reordered pictures in IDR, they are decodable.
1120    }
1121    else 
1122    {
1123      static Bool warningMessage = false;
1124      if(!warningMessage)
1125      {
1126        printf("\nWarning: this is not a valid random access point and the data is discarded until the first CRA picture");
1127        warningMessage = true;
1128      }
1129      return true;
1130    }
1131  }
1132  // skip the reordered pictures, if necessary
1133  else if (m_apcSlicePilot->getPOC() < m_pocRandomAccess && (m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_TFD || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_RASL_N))
1134  {
1135    iPOCLastDisplay++;
1136    return true;
1137  }
1138  // if we reach here, then the picture is not skipped.
1139  return false; 
1140}
1141
1142//! \}
Note: See TracBrowser for help on using the repository browser.