source: 3DVCSoftware/branches/0.1-poznan-univ/source/Lib/TLibEncoder/TEncTop.cpp

Last change on this file was 2, checked in by hhi, 13 years ago

inital import

  • Property svn:eol-style set to native
File size: 22.6 KB
Line 
1
2
3/** \file     TEncTop.cpp
4    \brief    encoder class
5*/
6
7#include "../TLibCommon/CommonDef.h"
8#include "TEncTop.h"
9
10#include "TEncGOP.h"
11#include "../../App/TAppEncoder/TAppEncTop.h"
12
13// ====================================================================================================================
14// Constructor / destructor / create / destroy
15// ====================================================================================================================
16
17TEncTop::TEncTop()
18{
19  m_iPOCLast          = -1;
20  m_iNumPicRcvd       =  0;
21  m_uiNumAllPicCoded  =  0;
22  m_pppcRDSbacCoder   =  NULL;
23  m_pppcBinCoderCABAC =  NULL;
24  m_cRDGoOnSbacCoder.init( &m_cRDGoOnBinCoderCABAC );
25#if ENC_DEC_TRACE
26  g_hTrace = fopen( "TraceEnc.txt", "wb" );
27  g_bJustDoIt = g_bEncDecTraceDisable;
28  g_nSymbolCounter = 0;
29#endif
30  m_bSeqFirst = true;
31  m_iFrameNumInCodingOrder = 0;
32}
33
34TEncTop::~TEncTop()
35{
36#if ENC_DEC_TRACE
37  fclose( g_hTrace );
38#endif
39}
40
41Void TEncTop::create ()
42{
43  // initialize global variables
44  if(m_uiViewId<1 && !m_bIsDepth)
45    initROM();
46
47  // create processing unit classes
48  m_cPicEncoder.        create( getSourceWidth(), getSourceHeight(), g_uiMaxCUWidth, g_uiMaxCUHeight );
49  m_cSliceEncoder.      create( getSourceWidth(), getSourceHeight(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth );
50  m_cCuEncoder.         create( g_uiMaxCUDepth, g_uiMaxCUWidth, g_uiMaxCUHeight );
51#if MTK_SAO
52  if (m_bUseSAO)
53  {
54    m_cEncSAO.create( getSourceWidth(), getSourceHeight(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth );
55    m_cEncSAO.createEncBuffer();
56  }
57#endif
58  m_cAdaptiveLoopFilter.create( getSourceWidth(), getSourceHeight(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth );
59  m_cLoopFilter.        create( g_uiMaxCUDepth );
60  m_cDepthMapGenerator. create( false, getSourceWidth(), getSourceHeight(), g_uiMaxCUDepth, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiBitDepth + g_uiBitIncrement );
61  m_cResidualGenerator. create( false, getSourceWidth(), getSourceHeight(), g_uiMaxCUDepth, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiBitDepth + g_uiBitIncrement );
62
63#if MQT_BA_RA && MQT_ALF_NPASS
64  if(m_bUseALF)
65  {
66    m_cAdaptiveLoopFilter.createAlfGlobalBuffers(m_iALFEncodePassReduction);
67  }
68#endif
69
70  // if SBAC-based RD optimization is used
71  if( m_bUseSBACRD )
72  {
73    UInt uiNumCEnc = 1 + Max( g_uiMaxCUDepth, AO_MAX_DEPTH ); // HS: prevents crash in SAO for small maximum CU sizes
74    m_pppcRDSbacCoder = new TEncSbac** [uiNumCEnc];
75    m_pppcBinCoderCABAC = new TEncBinCABAC** [uiNumCEnc];
76
77    for ( Int iDepth = 0; iDepth < uiNumCEnc; iDepth++ )
78    {
79      m_pppcRDSbacCoder[iDepth] = new TEncSbac* [CI_NUM];
80      m_pppcBinCoderCABAC[iDepth] = new TEncBinCABAC* [CI_NUM];
81
82      for (Int iCIIdx = 0; iCIIdx < CI_NUM; iCIIdx ++ )
83      {
84        m_pppcRDSbacCoder[iDepth][iCIIdx] = new TEncSbac;
85        m_pppcBinCoderCABAC [iDepth][iCIIdx] = new TEncBinCABAC;
86        m_pppcRDSbacCoder   [iDepth][iCIIdx]->init( m_pppcBinCoderCABAC [iDepth][iCIIdx] );
87      }
88    }
89  }
90
91#if HHI_DMM_INTRA
92  if( g_aacWedgeLists.empty() && m_bUseDepthModelModes && m_bIsDepth )
93  {
94    initWedgeLists();
95  }
96#endif
97}
98
99Void TEncTop::destroy ()
100{
101#if MQT_BA_RA && MQT_ALF_NPASS
102  if(m_bUseALF)
103  {
104    m_cAdaptiveLoopFilter.destroyAlfGlobalBuffers();
105  }
106#endif
107
108  // destroy processing unit classes
109  m_cPicEncoder.        destroy();
110  m_cSliceEncoder.      destroy();
111  m_cCuEncoder.         destroy();
112#if MTK_SAO
113  if (m_cSPS.getUseSAO())
114  {
115    m_cEncSAO.destroy();
116    m_cEncSAO.destoryEncBuffer();
117  }
118#endif
119  m_cAdaptiveLoopFilter.destroy();
120  m_cLoopFilter.        destroy();
121  m_cDepthMapGenerator. destroy();
122  m_cResidualGenerator. destroy();
123
124  // SBAC RD
125  if( m_bUseSBACRD )
126  {
127    Int iDepth;
128    for ( iDepth = 0; iDepth < g_uiMaxCUDepth+1; iDepth++ )
129    {
130      for (Int iCIIdx = 0; iCIIdx < CI_NUM; iCIIdx ++ )
131      {
132        delete m_pppcRDSbacCoder[iDepth][iCIIdx];
133        delete m_pppcBinCoderCABAC[iDepth][iCIIdx];
134      }
135    }
136
137    for ( iDepth = 0; iDepth < g_uiMaxCUDepth+1; iDepth++ )
138    {
139      delete [] m_pppcRDSbacCoder[iDepth];
140      delete [] m_pppcBinCoderCABAC[iDepth];
141    }
142
143    delete [] m_pppcRDSbacCoder;
144    delete [] m_pppcBinCoderCABAC;
145  }
146
147  // destroy ROM
148  if(m_uiViewId<1 && !m_bIsDepth)
149    destroyROM();
150
151  return;
152}
153
154Void TEncTop::init( TAppEncTop* pcTAppEncTop )
155{
156  UInt *aTable4=NULL, *aTable8=NULL;
157#if QC_MOD_LCEC
158  UInt* aTableLastPosVlcIndex=NULL;
159#endif
160  // initialize SPS
161  xInitSPS();
162
163#if CONSTRAINED_INTRA_PRED
164  // initialize PPS
165  xInitPPS();
166#endif
167
168  // initialize processing unit classes
169  m_cPicEncoder.  init( this );
170  m_cSliceEncoder.init( this );
171  m_cCuEncoder.   init( this );
172
173  m_pcTAppEncTop = pcTAppEncTop;
174  m_cDepthMapGenerator.init( (TComPrediction*)this->getPredSearch(), m_pcTAppEncTop->getSPSAccess(), m_pcTAppEncTop->getAUPicAccess() );
175  m_cResidualGenerator.init( &m_cTrQuant, &m_cDepthMapGenerator );
176
177  // initialize transform & quantization class
178  m_pcCavlcCoder = getCavlcCoder();
179#if !CAVLC_COEF_LRG_BLK
180  aTable8 = m_pcCavlcCoder->GetLP8Table();
181#endif
182  aTable4 = m_pcCavlcCoder->GetLP4Table();
183#if QC_MOD_LCEC
184  aTableLastPosVlcIndex=m_pcCavlcCoder->GetLastPosVlcIndexTable();
185
186  m_cTrQuant.init( g_uiMaxCUWidth, g_uiMaxCUHeight, 1 << m_uiQuadtreeTULog2MaxSize, m_iSymbolMode, aTable4, aTable8,
187    aTableLastPosVlcIndex, m_bUseRDOQ, true );
188#else
189  m_cTrQuant.init( g_uiMaxCUWidth, g_uiMaxCUHeight, 1 << m_uiQuadtreeTULog2MaxSize, m_iSymbolMode, aTable4, aTable8, m_bUseRDOQ, true );
190#endif
191
192  // initialize encoder search class
193  m_cSearch.init( this, &m_cTrQuant, m_iSearchRange, m_bipredSearchRange, m_iFastSearch, 0, &m_cEntropyCoder, &m_cRdCost, getRDSbacCoder(), getRDGoOnSbacCoder() );
194  m_cSeqIter  = TEncSeqStructure::Iterator( m_cSequenceStructure, 0, 0 );
195  m_bPicWaitingForCoding = false ;
196
197#if MQT_ALF_NPASS
198  if(m_bUseALF)
199  {
200    m_cAdaptiveLoopFilter.setALFEncodePassReduction( m_iALFEncodePassReduction );
201  }
202#endif
203}
204
205// ====================================================================================================================
206// Public member functions
207// ====================================================================================================================
208
209Void TEncTop::deletePicBuffer()
210{
211  TComList<TComPic*>::iterator iterPic = m_cListPic.begin();
212  Int iSize = Int( m_cListPic.size() );
213
214  for ( Int i = 0; i < iSize; i++ )
215  {
216    TComPic* pcPic = *(iterPic++);
217
218    pcPic->destroy();
219    delete pcPic;
220    pcPic = NULL;
221  }
222}
223
224/**
225 - Application has picture buffer list with size of GOP + 1
226 - Picture buffer list acts like as ring buffer
227 - End of the list has the latest picture
228 .
229 \param   bEos                true if end-of-sequence is reached
230 \param   pcPicYuvOrg         original YUV picture
231 \retval  rcListPicYuvRecOut  list of reconstruction YUV pictures
232 \retval  rcListBitstreamOut  list of output bitstreams
233 \retval  iNumEncoded         number of encoded pictures
234 */
235Void TEncTop::encode( bool bEos, std::map<PicOrderCnt, TComPicYuv*>& rcMapPicYuvRecOut, TComBitstream* pcBitstreamOut, Bool& bNewPicNeeded )
236{
237
238  //  TComBitstream*  pcBitstreamOut ;
239  TComPicYuv*     pcPicYuvRecOut;
240  TComPic*        pcOrgRefList[2][MAX_REF_PIC_NUM];  //GT: not used?
241  TComPic*        pcPic ;
242
243  bool bSomethingCoded = false ;
244
245  if (m_bPicWaitingForCoding )
246  {
247    std::map<Int, TComPic*>::iterator cIter = m_acInputPicMap.find( (Int)m_cSeqIter.getPoc() );
248    const bool bPictureAvailable = cIter != m_acInputPicMap.end();
249    if (bPictureAvailable) //GT: it is possible that poc to code is not in input-picmap, but m_bPicWaitingForCoding is true, since current poc is beyond sequence-end
250    {
251      assert( m_acOutputPicMap.find( m_cSeqIter.getPoc() ) != m_acOutputPicMap.end() );
252      pcPicYuvRecOut = m_acOutputPicMap[m_cSeqIter.getPoc()];
253      m_acOutputPicMap.erase( m_cSeqIter.getPoc() );
254      pcPic          = cIter->second ;
255
256      // add extra pic buffers
257      Bool  bNeedPrdDepthMapBuf = ( m_uiPredDepthMapGeneration > 0 );
258      if( bNeedPrdDepthMapBuf && !pcPic->getPredDepthMap() )
259      {
260        pcPic->addPrdDepthMapBuffer();
261      }
262
263      // needed? dont think so
264      TComPicYuv      cPicOrg;
265      cPicOrg.create( pcPic->getPicYuvOrg()->getWidth(), pcPic->getPicYuvOrg()->getHeight(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth );
266      pcPic->getPicYuvOrg()->copyToPic( &cPicOrg );
267      xSetPicProperties( pcPic) ;
268      m_cPicEncoder.compressPic( pcBitstreamOut, cPicOrg, pcPic, pcPicYuvRecOut, pcOrgRefList,  m_bSeqFirst,  m_cListPic);
269      bSomethingCoded = true;
270      m_acInputPicMap.erase( cIter );
271      cPicOrg.destroy() ;
272      assert( rcMapPicYuvRecOut.find( pcPic->getPOC() ) == rcMapPicYuvRecOut.end() );
273      rcMapPicYuvRecOut[pcPic->getPOC()] = pcPicYuvRecOut;
274    }
275    else if(m_uiViewId==-1)
276      printf("\nPOC %4d skipped due to sequence end", Int(m_cSeqIter.getPoc()) );
277    else
278    {
279      if( m_bIsDepth )
280      {
281        printf("\nDepth View \t%4d\t POC %4d skipped due to sequence end", m_uiViewId, Int(m_cSeqIter.getPoc() ));
282      }
283      else
284      {
285        printf("\nView \t\t%4d\t POC %4d skipped due to sequence end", m_uiViewId, Int(m_cSeqIter.getPoc() ));
286      }
287    }
288    ++m_cSeqIter; //GT: increment, even bPictureAvailable might be false, (POC beyond sequence end);
289
290    Bool hitSeqEndButHasToCode = bEos && !m_acInputPicMap.empty();
291    if( (m_acInputPicMap.find( (Int)m_cSeqIter.getPoc() ) != m_acInputPicMap.end()) || hitSeqEndButHasToCode ) //GT: new poc also in InputList
292    {
293      m_bPicWaitingForCoding = true;
294      bNewPicNeeded = false ;
295    }
296    else
297    {
298      m_bPicWaitingForCoding = false;
299      bNewPicNeeded = true ;
300    }
301  }
302
303
304  if(bSomethingCoded && !m_bPicWaitingForCoding ) //GT: no gaps any more
305  {
306    m_uiNumAllPicCoded += m_iNumPicRcvd;
307    m_iNumPicRcvd       = 0;
308  }
309
310
311  if (bEos&&m_uiViewId==-1)
312  {
313    printOutSummary (m_uiNumAllPicCoded);
314  }
315}
316
317
318Void TEncTop::receivePic( bool bEos, TComPicYuv* pcPicYuvOrg, TComPicYuv* pcPicYuvRec, TComPicYuv* pcOrgPdmDepth )
319{
320  if( !m_bPicWaitingForCoding ) //GT: insert pcPicYuvOrg in m_acInputPicMap and m_cListPic
321  {
322    TComPic* pcPicCurr = NULL;
323    xGetNewPicBuffer( pcPicCurr ); //GT: assigns next POC to input pic and stores it in m_cListPic
324    pcPicYuvOrg->copyToPic( pcPicCurr->getPicYuvOrg() );
325    if( m_uiMultiviewMvRegMode )
326    {
327      AOF( pcOrgPdmDepth );
328      AOF( pcPicCurr->getOrgDepthMap() );
329      pcOrgPdmDepth->copyToPic( pcPicCurr->getOrgDepthMap() );
330    }
331    else
332    {
333      AOT( pcOrgPdmDepth );
334      AOT( pcPicCurr->getOrgDepthMap() );
335    }
336    m_acInputPicMap.insert( std::make_pair(pcPicCurr->getPOC(), pcPicCurr)); //GT: input pic to m_acInputPicMap
337    assert( m_acOutputPicMap.find( pcPicCurr->getPOC() ) == m_acOutputPicMap.end() );
338    m_acOutputPicMap[pcPicCurr->getPOC()] = pcPicYuvRec;
339  }
340
341  bool hitSeqEndButHasToCode = bEos && !m_acInputPicMap.empty();  //GT: End of sequence has been reached, but still pictures to code left
342  m_bPicWaitingForCoding = m_bPicWaitingForCoding || hitSeqEndButHasToCode ;
343
344  if( m_acInputPicMap.find( (Int)m_cSeqIter.getPoc() ) != m_acInputPicMap.end() ) //GT: If poc to code is in input-picmap; not necessary
345  {
346    m_bPicWaitingForCoding = true;
347  }
348}
349
350
351Void
352TEncTop::deleteExtraPicBuffers( Int iPoc )
353{
354  TComPic*                      pcPic = 0;
355  TComList<TComPic*>::iterator  cIter = m_cListPic.begin();
356  TComList<TComPic*>::iterator  cEnd  = m_cListPic.end  ();
357  for( ; cIter != cEnd; cIter++ )
358  {
359    if( (*cIter)->getPOC() == iPoc )
360    {
361      pcPic = *cIter;
362      break;
363    }
364  }
365  AOF( pcPic );
366  if ( pcPic )
367  {
368    pcPic->removeOriginalBuffer   ();
369    pcPic->removeOrgDepthMapBuffer();
370    pcPic->removeResidualBuffer   ();
371    pcPic->removeUsedPelsMapBuffer();
372  }
373}
374
375
376#if AMVP_BUFFERCOMPRESS
377Void
378TEncTop::compressMotion( Int iPoc )
379{
380  TComPic*                      pcPic = 0;
381  TComList<TComPic*>::iterator  cIter = m_cListPic.begin();
382  TComList<TComPic*>::iterator  cEnd  = m_cListPic.end  ();
383  for( ; cIter != cEnd; cIter++ )
384  {
385    if( (*cIter)->getPOC() == iPoc )
386    {
387      pcPic = *cIter;
388      break;
389    }
390  }
391  AOF( pcPic );
392  if ( pcPic )
393  {
394    pcPic->compressMotion();
395  }
396}
397#endif
398
399
400
401// ====================================================================================================================
402// Protected member functions
403// ====================================================================================================================
404
405/**
406 - Application has picture buffer list with size of GOP + 1
407 - Picture buffer list acts like as ring buffer
408 - End of the list has the latest picture
409 .
410 \retval rpcPic obtained picture buffer
411 */
412Void TEncTop::xGetNewPicBuffer ( TComPic*& rpcPic )
413{
414  TComSlice::sortPicList(m_cListPic);
415
416  // bug-fix - erase frame memory (previous GOP) which is not used for reference any more
417  if (m_cListPic.size() >=  m_uiCodedPictureStoreSize )  // 2)   //  K. Lee bug fix - for multiple reference > 2
418  {
419    rpcPic = m_cListPic.popFront();
420
421    // is it necessary without long-term reference?
422  }
423  else
424  {
425    rpcPic = new TComPic;
426    rpcPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth );
427  }
428
429  m_cListPic.pushBack( rpcPic );
430  rpcPic->setReconMark (false);
431
432  m_iPOCLast++;
433  m_iNumPicRcvd++;
434
435  rpcPic->addOriginalBuffer();
436  if( m_uiMultiviewMvRegMode )
437  {
438    rpcPic->addOrgDepthMapBuffer();
439  }
440  if( m_bOmitUnusedBlocks )
441  {
442    rpcPic->addUsedPelsMapBuffer();
443  }
444
445  rpcPic->setCurrSliceIdx( 0 ); // MW
446  rpcPic->getSlice(0)->setPOC( m_iPOCLast );
447
448  // mark it should be extended
449  rpcPic->getPicYuvRec()->setBorderExtension(false);
450}
451
452
453Void TEncTop::xInitSPS()
454{
455  m_cSPS.setWidth         ( m_iSourceWidth      );
456  m_cSPS.setHeight        ( m_iSourceHeight     );
457  m_cSPS.setPad           ( m_aiPad             );
458  m_cSPS.setMaxCUWidth    ( g_uiMaxCUWidth      );
459  m_cSPS.setMaxCUHeight   ( g_uiMaxCUHeight     );
460  m_cSPS.setMaxCUDepth    ( g_uiMaxCUDepth      );
461  m_cSPS.setMinTrDepth    ( 0                   );
462  m_cSPS.setMaxTrDepth    ( 1                   );
463
464  m_cSPS.setUseALF        ( m_bUseALF           );
465
466  m_cSPS.setQuadtreeTULog2MaxSize( m_uiQuadtreeTULog2MaxSize );
467  m_cSPS.setQuadtreeTULog2MinSize( m_uiQuadtreeTULog2MinSize );
468  m_cSPS.setQuadtreeTUMaxDepthInter( m_uiQuadtreeTUMaxDepthInter    );
469  m_cSPS.setQuadtreeTUMaxDepthIntra( m_uiQuadtreeTUMaxDepthIntra    );
470
471  m_cSPS.setUseDQP        ( m_iMaxDeltaQP != 0  );
472#if !SB_NO_LowDelayCoding
473  m_cSPS.setUseLDC        ( m_bUseLDC           );
474#endif
475  m_cSPS.setUsePAD        ( m_bUsePAD           );
476
477  m_cSPS.setUseMRG        ( m_bUseMRG           ); // SOPH:
478
479#if LM_CHROMA
480  m_cSPS.setUseLMChroma   ( m_bUseLMChroma           );
481#endif
482
483  m_cSPS.setMaxTrSize   ( 1 << m_uiQuadtreeTULog2MaxSize );
484
485  if( m_bIsDepth )
486  {
487    m_cSPS.initMultiviewSPSDepth    ( m_uiViewId, m_iViewOrderIdx );
488    m_cSPS.setPredDepthMapGeneration( m_uiViewId, true );
489    m_cSPS.setMultiviewResPredMode  ( 0 );
490  }
491  else
492  {
493    m_cSPS.initMultiviewSPS           ( m_uiViewId, m_iViewOrderIdx, m_uiCamParPrecision, m_bCamParInSliceHeader, m_aaiCodedScale, m_aaiCodedOffset );
494    if( m_uiViewId )
495    {
496      m_cSPS.setPredDepthMapGeneration( m_uiViewId, false, m_uiPredDepthMapGeneration, m_uiMultiviewMvPredMode, m_uiPdmPrecision, m_aaiPdmScaleNomDelta, m_aaiPdmOffset );
497      m_cSPS.setMultiviewResPredMode  ( m_uiMultiviewResPredMode );
498    }
499    else
500    {
501      m_cSPS.setPredDepthMapGeneration( m_uiViewId, false );
502      m_cSPS.setMultiviewResPredMode  ( 0 );
503    }
504  }
505  m_cSPS.setSPSId( ( m_uiViewId << 1 ) + ( m_bIsDepth ? 1 : 0 ) );
506
507#if DCM_COMB_LIST
508  m_cSPS.setUseLComb    ( m_bUseLComb           );
509  m_cSPS.setLCMod       ( m_bLCMod   );
510#endif
511
512  Int i;
513#if HHI_AMVP_OFF
514  for ( i = 0; i < g_uiMaxCUDepth; i++ )
515  {
516    m_cSPS.setAMVPMode( i, AM_NONE );
517  }
518#else
519  for ( i = 0; i < g_uiMaxCUDepth; i++ )
520  {
521    m_cSPS.setAMVPMode( i, AM_EXPL );
522  }
523#endif
524
525
526#if HHI_RMP_SWITCH
527  m_cSPS.setUseRMP( m_bUseRMP );
528#endif
529
530  m_cSPS.setBitDepth    ( g_uiBitDepth        );
531  m_cSPS.setBitIncrement( g_uiBitIncrement    );
532
533#if MTK_NONCROSS_INLOOP_FILTER
534  m_cSPS.setLFCrossSliceBoundaryFlag( m_bLFCrossSliceBoundaryFlag );
535#endif
536#if MTK_SAO
537  m_cSPS.setUseSAO             ( m_bUseSAO         );
538#endif
539#if HHI_DMM_INTRA
540  m_cSPS.setUseDepthModelModes( m_bUseDepthModelModes );
541#endif
542  m_cSPS.setUseMVI( m_bUseMVI );
543
544  m_cSPS.setCodedPictureBufferSize( m_uiCodedPictureStoreSize );
545}
546
547#if CONSTRAINED_INTRA_PRED
548Void TEncTop::xInitPPS()
549{
550  m_cPPS.setConstrainedIntraPred( m_bUseConstrainedIntraPred );
551  m_cPPS.setPPSId( ( m_uiViewId << 1 ) + ( m_bIsDepth ? 1 : 0 ) );
552  m_cPPS.setSPSId( ( m_uiViewId << 1 ) + ( m_bIsDepth ? 1 : 0 ) );
553
554#ifdef WEIGHT_PRED
555  m_cPPS.setUseWP( m_bUseWeightPred );
556  m_cPPS.setWPBiPredIdc( m_uiBiPredIdc );
557#endif
558}
559#endif
560
561
562Void TEncTop::setTEncTopList(std::vector<TEncTop*>* pacTEncTopList )
563{
564  assert(m_uiViewId!=-1); // not to be set for single view coding
565
566  m_pacTEncTopList=pacTEncTopList;
567
568}
569
570
571Void TEncTop::printOutSummary(UInt uiNumAllPicCoded)
572{
573  assert (uiNumAllPicCoded == m_cAnalyzeAll.getNumPic());
574
575  //--CFG_KDY
576  m_cAnalyzeAll.setFrmRate( getFrameRate() );
577  m_cAnalyzeI.setFrmRate( getFrameRate() );
578  m_cAnalyzeP.setFrmRate( getFrameRate() );
579  m_cAnalyzeB.setFrmRate( getFrameRate() );
580
581  //-- all
582  if(m_uiViewId==-1)
583    printf( "\n\nSUMMARY --------------------------------------------------------\n" );
584  else {
585    if ( m_bIsDepth )
586    {
587      printf( "\n\nSUMMARY ---------------------------------------------- DEPTH %2d\n", m_uiViewId );
588    }
589    else
590    {
591      printf( "\n\nSUMMARY ---------------------------------------------- VIDEO %2d\n", m_uiViewId );
592    }
593  };
594  m_cAnalyzeAll.printOut('a');
595
596  printf( "\n\nI Slices--------------------------------------------------------\n" );
597  m_cAnalyzeI.printOut('i');
598
599  printf( "\n\nP Slices--------------------------------------------------------\n" );
600  m_cAnalyzeP.printOut('p');
601
602  printf( "\n\nB Slices--------------------------------------------------------\n" );
603  m_cAnalyzeB.printOut('b');
604
605#if _SUMMARY_OUT_
606  m_cAnalyzeAll.printSummaryOut();
607#endif
608#if _SUMMARY_PIC_
609  m_cAnalyzeI.printSummary('I');
610  m_cAnalyzeP.printSummary('P');
611  m_cAnalyzeB.printSummary('B');
612#endif
613}
614
615Void TEncTop::xSetRefPics( TComPic* pcPic, RefPicList eRefPicList )
616{
617  assert(m_cSeqIter.getFrameDescriptor().getAllowedRelativeRefPocs( eRefPicList, pcPic->getViewIdx() ).size() == m_cSeqIter.getFrameDescriptor().getAllowedReferenceViewIdx( eRefPicList, pcPic->getViewIdx()).size());
618#if 1
619  // check if refPic is available
620  Int iNumberOfRefs = 0;
621  std::vector<Int> aiRefPocs ;
622  std::vector<Int> aiRefViews ;
623
624  for( Int i=0; i<(Int)m_cSeqIter.getFrameDescriptor().getAllowedRelativeRefPocs( eRefPicList, pcPic->getViewIdx() ).size(); i++ )
625  {
626    Int iRefPoc  = m_cSeqIter.getFrameDescriptor().getAllowedRelativeRefPocs( eRefPicList, pcPic->getViewIdx() )[i]+pcPic->getPOC() ;
627    Int iRefViewIdx = m_cSeqIter.getFrameDescriptor().getAllowedReferenceViewIdx( eRefPicList, pcPic->getViewIdx() )[i];
628    Bool bFoundRefPic = false;
629
630    if( iRefPoc == pcPic->getPOC() ) // interview
631    {
632      assert( iRefViewIdx < (Int)m_uiViewId );
633      aiRefPocs.push_back(iRefPoc);
634      aiRefViews.push_back(iRefViewIdx);
635      iNumberOfRefs++ ;
636      bFoundRefPic = true ;
637      continue;
638    }
639    else if ( iRefViewIdx < 0 ) // temporal
640    {
641      for( TComList<TComPic*>::iterator it = m_cListPic.begin(); it!=m_cListPic.end(); it++)
642      {
643        if( (*it)->getViewIdx() == pcPic->getViewIdx() && (*it)->getPOC() == iRefPoc && (*it)->getReconMark() )
644        {
645          aiRefPocs.push_back(iRefPoc);
646          aiRefViews.push_back(m_uiViewId);
647          bFoundRefPic = true ;
648          iNumberOfRefs++ ;
649          break;
650        }
651      }
652      if( (iRefPoc < pcPic->getPOC()) && !bFoundRefPic )
653      {
654        printf("\nInconsistence in GOP-String!");
655        assert(0);
656      }
657    }
658  }
659  for ( Int i=0; i< iNumberOfRefs; i++)
660  {
661    pcPic->setRefViewIdx( aiRefViews[i], eRefPicList, i );
662    pcPic->setRefPOC(aiRefPocs[i], eRefPicList, i );
663  }
664  pcPic->setNumRefs( iNumberOfRefs, eRefPicList );
665#else
666  for( Int i=0; i<(Int)m_cSeqIter.getFrameDescriptor().getAllowedRelativeRefPocs( eRefPicList, pcPic->getViewIdx() ).size(); i++ )
667  {
668    const int iRefViewIdx = m_cSeqIter.getFrameDescriptor().getAllowedReferenceViewIdx( eRefPicList, pcPic->getViewIdx() )[i];
669    if( iRefViewIdx < 0 )
670    {
671      // temporal reference from current view
672      pcPic->setRefViewIdx( m_iViewIdx, eRefPicList, i );
673    }
674    else
675    {
676      pcPic->setRefViewIdx( iRefViewIdx, eRefPicList, i );
677    }
678    pcPic->setRefPOC(m_cSeqIter.getFrameDescriptor().getAllowedRelativeRefPocs( eRefPicList, pcPic->getViewIdx() )[i]+pcPic->getPOC(), eRefPicList, i );
679  }
680  pcPic->setNumRefs( m_cSeqIter.getFrameDescriptor().getAllowedRelativeRefPocs( eRefPicList, pcPic->getViewIdx() ).size(), eRefPicList );
681#endif
682}
683
684Void TEncTop::xCheckSliceType(TComPic* pcPic)
685{
686  if( pcPic->getNumRefs(REF_PIC_LIST_0) == 0 && pcPic->getNumRefs(REF_PIC_LIST_1) == 0 && pcPic->getSliceType() == I_SLICE )
687  {
688    return ;
689  }
690  if( pcPic->getNumRefs(REF_PIC_LIST_0) != 0 && pcPic->getNumRefs(REF_PIC_LIST_1) == 0 && pcPic->getSliceType() == P_SLICE )
691  {
692    return ;
693  }
694  if( pcPic->getNumRefs(REF_PIC_LIST_0) != 0 && pcPic->getNumRefs(REF_PIC_LIST_1) != 0 && pcPic->getSliceType() == B_SLICE )
695  {
696    return ;
697  }
698  if( pcPic->getNumRefs(REF_PIC_LIST_0) == 0 && pcPic->getNumRefs(REF_PIC_LIST_1) == 0 )
699  {
700    pcPic->setSliceType(I_SLICE) ;
701    return;
702  }
703  if( pcPic->getNumRefs(REF_PIC_LIST_0) != 0 && pcPic->getNumRefs(REF_PIC_LIST_1) == 0 )
704  {
705    pcPic->setSliceType(P_SLICE) ;
706    return;
707  }
708
709  assert(0);
710}
711
712
713Void TEncTop::xSetPicProperties(TComPic* pcPic)
714{
715  pcPic->setSliceType( m_cSeqIter.getFrameDescriptor().getSliceType(m_uiViewId) );
716  pcPic->setReferenced( m_cSeqIter.getFrameDescriptor().getStoreForRef(m_uiViewId) );
717  pcPic->setColDir( m_cSeqIter.getFrameDescriptor().getColDir() ) ;
718  const Bool bQpChangePointPassed = m_iFrameNumInCodingOrder++ >= getQpChangeFrame();
719  const Int  iQpChangeOffset      = bQpChangePointPassed ? ( m_bIsDepth ? getQpChangeOffsetDepth() : getQpChangeOffsetVideo() ) : 0;
720  pcPic->setQP(max(MIN_QP,min(MAX_QP, m_iQP+ m_aiTLayerQPOffset[m_cSeqIter.getFrameDescriptor().getTEncSeqStructureLayer(m_uiViewId)] + iQpChangeOffset )) );
721  pcPic->setViewIdx( m_uiViewId );
722#if 0
723  pcPic->setNumRefs(0, REF_PIC_LIST_0);
724  pcPic->setNumRefs(0, REF_PIC_LIST_1);
725
726
727  if( m_cSeqIter.getFrameDescriptor().getSliceType(m_iViewIdx)== P_SLICE || m_cSeqIter.getFrameDescriptor().getSliceType(m_iViewIdx)== B_SLICE)
728  {
729    xSetRefPics( pcPic, REF_PIC_LIST_0 );
730  }
731  if( m_cSeqIter.getFrameDescriptor().getSliceType(m_iViewIdx)== B_SLICE)
732  {
733    xSetRefPics( pcPic, REF_PIC_LIST_1 );
734  }
735#else
736  xSetRefPics( pcPic, REF_PIC_LIST_0 );
737  xSetRefPics( pcPic, REF_PIC_LIST_1 );
738  xCheckSliceType( pcPic );
739#endif
740
741  pcPic->setScaleOffset( m_aaiCodedScale, m_aaiCodedOffset );
742}
Note: See TracBrowser for help on using the repository browser.